0

我是 oop 的新手,我正在尝试弄清楚我正在做的事情是运行良好还是非常糟糕的编程。

我正在为派生类的对象动态分配内存。但我希望能够在必要时使用代码的同一部分重复执行此操作。我有一个简单的用户界面,用户可以在其中选择一个选项来将条目添加到列表(这是一个向量)。但是,我需要能够根据需要多次执行此操作。所以这是我的代码的必要部分:

case 1:
    Entry * entry = new list_entry;
    list.push_back(entry);
    continue;

这实际上是在做我想做的事,但我担心它会构成内存泄漏,因为我从不删除内存。我已经读过,一旦指向对象的指针超出范围,就不能再删除内存。但这本质上是我想要的,因为我希望能够使用相同的指针名称但指向不同的内存地址。否则,我将无法创建指向在运行时确定的不同数量的新对象的新指针。

这是正确的,还是我走错了路?谢谢

4

5 回答 5

3

是的,如果您从不删除,那就是内存泄漏。但是你为什么要使用指针和动态内存呢?您可以在 C++ 中创建对象,而无需使用 new

std::vector<list_entry> list;

case 1:
    Entry entry;
    list.push_back(entry);
    continue;

没有指针,没有内存泄漏。

于 2013-04-24T10:48:14.550 回答
1

这还不是内存泄漏,因为您将指针存储在列表中。这意味着您仍然可以访问内存,并在以后将其删除。

只需确保在删除或清除列表之前,遍历它并删除所有条目。

于 2013-04-24T10:49:39.203 回答
1

list当您不再需要此列表时,您可以通过手动删除包含在其中的指针来释放内存。

于 2013-04-24T10:47:51.600 回答
0

当你说:

但这本质上是我想要的,因为我希望能够使用相同的指针名称但指向不同的内存地址。否则,我将无法创建指向在运行时确定的不同数量的新对象的新指针。

delete我相信正在发生的事情是你对召唤所做的事情的看法与实际发生的事情之间的脱节。当delete被调用时,指针指向的内存被删除。指针本身仍然存在。您应该将指针视为引用位置的数字,而不是位置本身。

为了说明这一点,让我们举一个简单的例子。假设我们有指针foo *p,我们就有p = new foo。现在,等于类型对象所在的p内存位置。然后你打电话。它指向的对象已删除,但 p 本身未受影响。事实上,仍然是 equals ,但是内存中的那个位置现在包含空白空间,可以用于其他东西(严格来说这不是真的,但这样想更容易)。你现在可以做,并且将指向一些新的空间——甚至可能是旧的,现在是空的,空间——分配另一个空间。0x3afoodelete pp0x3ap = new foopfoo

总之:delete p销毁 p 指向的对象,但不销毁p指针本身,从而释放对象占用的内存。如果要销毁p指针,则可以将其从列表中删除。所以,如果要重用指针,首先要销毁它们指向的对象,然后再分配一个新的对象。(或者使用智能指针,如上所述。)

于 2013-04-24T23:42:30.760 回答
0

您实际上并没有丢失对对象的跟踪,因为指针保留在list. 因此,无需立即删除它们。
只要确保在您不再需要它们时删除它们即可list

于 2013-04-24T10:49:07.607 回答