Распределение и удаление памяти указателя - PullRequest
0 голосов
/ 28 апреля 2019

У меня простой вопрос относительно управления указателями в C ++. Когда я делаю следующее:

myTableWidget->setItem(j, i, new TableWidgetItem("something"));

Если я правильно понимаю, я создаю новый указатель на элемент таблицы. Однако, поскольку я не определил ни одного имени, я не могу выполнить операцию delete. Итак, это останется в памяти все время, пока работает моя программа, верно? Или я чего-то не понимаю?

Другое дело следующее. Предположим, у меня есть класс, который занимает 2 doubles (например, ComplexNumber класс). Деструктор моего класса пуст. Однако, если я вызову delete для элемента моего класса ComplexNumber, он собирается удалить этот элемент из моей памяти или просто вызвать деструктор, который пуст? Если этот элемент остается в памяти все время выполнения, как я могу правильно запрограммировать его для удаления, когда я хочу изменить значения моей таблицы? Пример ниже:

complex.h

class Complex
{
    public:
        double r;
        double i;

        Complex(double, double);
        ~Complex();

};

complex.cpp

Complex::Complex(const double& real, const double& imaginary): r(real), i(imaginary)
{

}
Complex::~Complex():
{

}

main.cpp

int main(int argc, char *argv[])
{
       Complex *a = new Complex a(2,3);
       delete a;
}

В этом случае моя память свободна от a (a уничтожена в моей памяти, а двойные 2 и 3 удалены) или она просто ничего не делает, так как мой деструктор пуст?

1 Ответ

1 голос
/ 28 апреля 2019

Если речь идет о QTableWidget::setItem, то соблюдайте документацию состояния «Таблица вступает во владение предметом». Это означает, что объект таблицы отвечает за уничтожение элемента, когда он больше не нужен.


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

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