类方法/函数内的指针

时间:2012-02-27 17:23:39

标签: c++ memory pointers

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

的方法
void Example::methodExample()
{

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

}

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

5 个答案:

答案 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_ptrscoped_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;

当你不再需要它时。指针超出了函数末尾的范围,但内存仍然在堆上分配。