我想知道C ++是如何处理由类方法或函数内部的指针创建的“对象”的内存。 例如类Example
的方法void Example::methodExample()
{
ExampleObject *pointer = new ExampleObject("image.jpg");
}
我应该以某种方式删除它还是自动删除? 对不起,如果我的问题很愚蠢,但我是初学者:P
答案 0 :(得分:2)
您有两个选择。
如果您使用原始指针,就像在示例中使用的那样,必须手动delete
使用new
创建的对象
如果不这样做,则表明存在内存泄漏。
void Example::methodExample()
{
ExampleObject *pointer = new ExampleObject("image.jpg");
// Stuff
delete pointer;
}
或者您可以使用智能指针,例如boost::scoped_ptr
或C ++ 11的std::unique_ptr
。
这些对象在删除时会自动删除其指向的内容。
有些人(比如我)会说首选这种方法,因为即使抛出异常并且未达到函数结尾,也会正确删除ExampleObject
。
void Example::methodExample()
{
boost::scoped_ptr<ExampleObject> pointer( new ExampleObject("image.jpg") );
// Stuff
}
答案 1 :(得分:1)
在现代C ++中,你根本不应该进行自己的内存管理。使用unique_ptr
或scoped_ptr
,当指针超出范围时会自动删除指针。
答案 2 :(得分:1)
如果你的对象在函数范围内,那么正确的构造根本不使用指针,而是使用自动对象,应该像这样创建。
ExampleObject example("image.jpg");
例如,您可以在if
构造中使用指针,else
条件不会构造对象,然后您希望稍后使用该对象
在这种情况下,使用自动指针对象,最好是unique_ptr(如果可用),如果没有,则boost::scoped_ptr
,但即使弃用的std :: auto_ptr也优于原始指针对象。例如:
std::unique_ptr<ExampleObject> example;
if( usingAnExample )
{
example.reset( new ExampleObject("image.jpg") );
}
else
{
// do stuff
}
// I still need example here if it was created
答案 3 :(得分:1)
我认为处理原始指针的适当方法(如您所示)是将指针存储为类的成员。然后,您可以在任何您想要的方法中为此指针分配内存,并留下释放类的析构函数中的内存。这些方面的东西:
class Example
{
public:
Example();
~Example();
void methodExample();
private:
ExampleObject* pointer;
};
void Example::Example()
: pointer(NULL)
{
}
void Example::~Example()
{
if (pointer) // release memory only if it was allocated
delete pointer;
}
void Example::methodExample()
{
pointer = new ExampleObject("image.jpg");
// add a safety check to verify if the allocation was successful
}
答案 4 :(得分:0)
你应该
delete pointer;
当你不再需要它时。指针超出了函数末尾的范围,但内存仍然在堆上分配。