我想知道C++如何处理由类方法或函数内的指针创建的“对象”的内存。 对于类实施例类内部的指针方法/函数
void Example::methodExample()
{
ExampleObject *pointer = new ExampleObject("image.jpg");
}
的示例方法我应该以某种方式删除,或者它自动删除? 很抱歉,如果我的问题是愚蠢的,但我是初学者:P
我想知道C++如何处理由类方法或函数内的指针创建的“对象”的内存。 对于类实施例类内部的指针方法/函数
void Example::methodExample()
{
ExampleObject *pointer = new ExampleObject("image.jpg");
}
的示例方法我应该以某种方式删除,或者它自动删除? 很抱歉,如果我的问题是愚蠢的,但我是初学者:P
您有两个选项。
如果你使用原始指针,如您使用的是你的榜样,您必须是用new
创建手动delete
对象。
如果你不这样做,你已经创建了内存泄漏。
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
}
我应该以某种方式删除,或者它自动删除?很抱歉,如果 我的问题是愚蠢的,但我是初学者:P
是的,你确实需要手动删除是如下:
delete pointer;
否则,你将有内存泄漏。
在另一方面,如果声明是这样的,那么它会自动当它超出范围释放:
ExampleObject object = ExampleObject("image.jpg");
为什么downvote? – Mysticial 2012-02-27 19:34:57
你应该
delete pointer;
当你没有更需要它。指针在函数结束时超出范围,但内存仍分配在堆上。
在现代C++中,你不应该做自己的内存管理。使用unique_ptr
或scoped_ptr
,当指针超出范围时它将自动删除指针。
如果你的对象被作用在函数中,那么你的正确的构造就是不使用指针,而是使用自动对象,它应该像这样创建。
ExampleObject example("image.jpg");
你可能在当时,那里的else
条件不会构造对象使用指针在什么地方,例如,在if
结构,然后你以后要使用的对象。
在这种情况下,使用自动指针对象,最好是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
我认为与原始指针处理(如你的例子)的appriate方法是店指针作为类的成员。然后你可以用你想要的任何方法为这个指针分配内存,然后在的类的析构函数中释放内存给。沿着这些线:
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
}
如果这真的是OP想要的,那么(a)在构造函数中将'pointer'初始化为null; (b)修正'methodExample'分配给成员; (c)根据[Rule of Three](http://stackoverflow.com/questions/4172722)添加一个非默认拷贝构造函数和拷贝赋值操作符。但我强烈怀疑OP只是想要一个自动对象,而没有'new'。 – 2012-02-27 17:48:11
谢谢@MikeSeymour!我会仔细阅读三法则。 – karlphillip 2012-02-27 18:48:53
所以我可以完全忘记原始指针,并开始使用增强智能指针? – fex 2012-02-27 20:33:58
**我的意见**是,你可以选择使用智能指针,只要你可以,只有当你必须使用原始指针。根据你在做什么,你可能永远不需要使用原始指针。 – 2012-02-27 21:29:40
@fex:你应该忘记原始指针。除非你在C++库上工作,否则你永远不需要它们。 – 2012-02-27 22:12:24