我有返回一个对象的函数,但我很困惑,我应该返回对象本身还是指向对象的指针?
这是我的功能的一个例子:
CImage CDocument::AddImage(string Name, string fileName)
{
CImage img = CImage();
img.Name = Name;
img.Path = fileName;
img.IwImage = Iw2DCreateImage(&fileName[0]);
Images.push_back(&img);
return img;
}
Run Code Online (Sandbox Code Playgroud)
这是正确的还是应该返回指向对象的指针:
CImage * CDocument::AddImage(string Name, string fileName)
{
CImage * img = new CImage();
img->Name = Name;
img->Path = fileName;
img->IwImage = Iw2DCreateImage(&fileName[0]);
Images.push_back(img);
return img;
}
Run Code Online (Sandbox Code Playgroud)
虽然最后一个代码无法正确编译,因为我收到此错误:
error C2440: 'initializing' : cannot convert from 'CImage' to 'CImage *'
Run Code Online (Sandbox Code Playgroud)
我认为这可能是一个非常简单的问题.我对c ++很新,所以请耐心等待.
这段代码存在多个问题,在C++编码时要理解的基本区别在于堆栈分配和堆分配.当你这样做时CImage img = CImage();,对象是在堆栈上创建的.函数结束时会自动销毁此对象.现在,如果返回指向此对象的指针,则调用程序将获取指向无效内存位置的指针,因为该对象已被销毁.您还将此对象的地址推送到向量中,一旦函数结束,该向量也将无效.同样的问题也存在fileName.
要解决此问题,您需要从堆中分配内存,以便在函数结束时不会破坏对象.您可以使用newC++ 在堆上分配对象.所以你的代码将成为CImage* pImage = new CImage();.请注意,在这种情况下,您有责任使用释放内存delete.因此,您可以CImage*使用此技术更改函数以返回.您也可以将此指针推入向量Images.注意,要释放为CImageobects 分配的内存,需要循环遍历Images向量并delete在每个指针上显式调用.
更好的方法是使用智能指针,例如std::shared_ptr在这种情况下,它将delete自动管理您的呼叫.