【问题标题】:Pointer memory allocation and delete指针内存分配和删除
【发布时间】:2019-09-17 08:45:46
【问题描述】:

我有一个关于 C++ 中指针管理的简单问题。 当我执行以下操作时:

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

如果我理解得很好,我正在创建一个指向 tablewidgetitem 的新指针。 但是,由于我没有定义任何名称,我无法执行delete 操作。 所以,这将在我的程序运行时一直保留在内存中,对吧?还是我看不懂?

还有以下内容。 假设我有一个需要 2 个 doubles 的课程(例如 ComplexNumber 课程)。我班级的析构函数是空的。但是,如果我在我的类ComplexNumber 的一个元素上调用delete,它是要删除我记忆中的这个元素还是只调用空的析构函数?如果此元素在所有运行时间都保留在内存中,当我想更改表的值时,如何正确编程以将其删除? 示例如下:

复杂的.h

class Complex
{
    public:
        double r;
        double i;

        Complex(double, double);
        ~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 被删除)或者它什么也不做,因为我的析构函数是空的?

【问题讨论】:

  • 回复:“我正在创建一个指向 tablewidgetitem 的新指针”——不,代码创建了一个新的 TableWidgetItem object; new 运算符的结果是指向该对象的指针。不要混淆对象和指针;他们是两个不同的东西。指针通常指向对象。

标签: c++ qt pointers memory


【解决方案1】:

如果我们谈论的是QTableWidget::setItem,那么请注意文档状态“表获取项目的所有权”。这意味着 table 对象负责在不再需要时销毁该项目。


delete 表达式做了两件事。首先,它运行其操作数指向的对象的析构函数。然后,它释放其操作数指向的内存。在您的示例中,分配的内存确实被释放了。

【讨论】:

  • 我用一个简单的例子更新了我的问题。感谢您对 QTableWidget 的回答。这是否意味着当我“附加”一个项目时,前一个项目会在内存中被删除?
  • 我猜“附加费”是指“替换”。是的,我希望setItem 在设置新项目时销毁前一个项目。为了说服自己,做一个实验——让TableWidgetItem的析构函数打印或记录一些东西,这样你就可以观察它在何时何地被调用。
  • 非常感谢您回答我的“简单”问题。我现在更好地理解了 delete 表达式背后发生的事情
猜你喜欢
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多