Указатели внутри классов методы / функции - PullRequest
1 голос
/ 27 февраля 2012

Я хотел бы знать, как C ++ работает с памятью "объектов", созданных указателем внутри методов или функций класса.Например, метод класса Example

void Example::methodExample()
{

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

}

Должен ли я каким-либо образом удалить это или оно автоматически удаляется?Извините, если мой вопрос глуп, но я начинающий: P

Ответы [ 5 ]

2 голосов
/ 27 февраля 2012

У вас есть две опции .

Если вы используете необработанный указатель, , как вы используете в своем примере , вы должны вручную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 голос
/ 27 февраля 2012

Я думаю, что подход к работе с необработанными указателями (как вы показали в качестве примера) заключается в сохранении указателя в качестве члена класса . Затем вы можете выделить память для этого указателя любым способом, который захотите, и оставить для освобождение памяти для деструктора класса . Что-то вроде этого:

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 
}
1 голос
/ 27 февраля 2012

Если ваш объект находится в области видимости внутри функции, тогда ваша правильная конструкция - вовсе не использовать указатель, а использовать автоматический объект, который должен быть создан следующим образом.

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
1 голос
/ 27 февраля 2012

Вы не должны вообще заниматься собственным управлением памятью в современном C ++. Используйте unique_ptr или scoped_ptr, что автоматически удалит указатель, когда они выйдут из области видимости.

0 голосов
/ 27 февраля 2012

Вы должны

delete pointer;

, когда он вам больше не нужен.Указатель выходит из области видимости в конце функции, но память все еще выделяется в куче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...