2012-02-27 81 views
1

我想知道C++如何处理由类方法或函数内的指针创建的“对象”的内存。 对于类实施例类内部的指针方法/函数

void Example::methodExample() 
{ 

    ExampleObject *pointer = new ExampleObject("image.jpg"); 

} 

的示例方法我应该以某种方式删除,或者它自动删除? 很抱歉,如果我的问题是愚蠢的,但我是初学者:P

回答

2

您有两个选项

如果你使用原始指针,如您使用的是你的榜样,您必须是用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 

} 
+2

所以我可以完全忘记原始指针,并开始使用增强智能指针? – fex 2012-02-27 20:33:58

+0

**我的意见**是,你可以选择使用智能指针,只要你可以,只有当你必须使用原始指针。根据你在做什么,你可能永远不需要使用原始指针。 – 2012-02-27 21:29:40

+0

@fex:你应该忘记原始指针。除非你在C++库上工作,否则你永远不需要它们。 – 2012-02-27 22:12:24

0

我应该以某种方式删除,或者它自动删除?很抱歉,如果 我的问题是愚蠢的,但我是初学者:P

是的,你确实需要手动删除是如下:

delete pointer; 

否则,你将有内存泄漏。


在另一方面,如果声明是这样的,那么它会自动当它超出范围释放:

ExampleObject object = ExampleObject("image.jpg"); 
+0

为什么downvote? – Mysticial 2012-02-27 19:34:57

0

你应该

delete pointer; 

当你没有更需要它。指针在函数结束时超出范围,但内存仍分配在堆上。

1

在现代C++中,你不应该做自己的内存管理。使用unique_ptrscoped_ptr,当指针超出范围时它将自动删除指针。

1

如果你的对象被作用在函数中,那么你的正确的构造就是不使用指针,而是使用自动对象,它应该像这样创建。

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 
1

我认为与原始指针处理(如你的例子)的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 
} 
+0

如果这真的是OP想要的,那么(a)在构造函数中将'pointer'初始化为null; (b)修正'methodExample'分配给成员; (c)根据[Rule of Three](http://stackoverflow.com/questions/4172722)添加一个非默认拷贝构造函数和拷贝赋值操作符。但我强烈怀疑OP只是想要一个自动对象,而没有'new'。 – 2012-02-27 17:48:11

+0

谢谢@MikeSeymour!我会仔细阅读三法则。 – karlphillip 2012-02-27 18:48:53