место удаления в классе для удаления указателя на член данных - PullRequest
0 голосов
/ 09 марта 2020

Я пишу простой класс, я просто хочу знать, где я должен удалить мой указатель.

#include<iostream>


class test
{
private:
    int* sum{new int};


public:
    int addFunc(int num1 = 5, int num2 = 2)
    {
        *sum = num1 + num2;
        return *sum;
    }

    void print()
    {
        std::cout << *sum << std::endl;
    }

};

int main()
{
    test obj;
    obj.addFunc();
    obj.print();
}

Я знаю, как использовать уникальные указатели, чтобы избавиться от удаления указателей, если я должен удалить свой указатель после возврата это или где-то еще.

Ответы [ 2 ]

3 голосов
/ 09 марта 2020

Вы удаляете это в деструкторе. Но если вы управляете необработанной памятью, вам также потребуется реализовать подходящий конструктор копирования и оператор присваивания копии и их аналоги перемещения.

В 99% + этих случаев вы просто захотите использовать автоматиз c жизни или умные указатели вместо.

2 голосов
/ 09 марта 2020

Краткий ответ: никогда, то есть в конце программы.

Проблема в том, что ваш класс копируемый. Если вы удалите указатель в деструкторе (который будет правильным местом для чего-то, выделенного во время построения), вы получите висячий указатель в следующем случае использования:

  • вы передаете ссылку на test объект для функции
  • внутри этой функции вы копируете объект в локальный объект: указатель будет скопирован, поэтому и исходный объект, и локальная копия будут указывать на одно и то же значение int
  • в конце функции локальный объект будет уничтожен. Если при удалении int, оригинал получит висячий указатель.

Короче говоря, короткая история: как только вы используете выделение во время построения, вы должны заботиться о построении и назначении копирования / перемещения, и разрушение.

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