我是否需要删除在堆中创建的堆栈中的指针?

Do I need to delete pointer in stack, which is created in heap?

int *createInt()
{
   int *a = new int;
   return a;
}

int main()
{
   int *x = createInt();
   *x = 10;
   cout << *x << '\n';
   delete x; // do I need this?
   return 0;
}

我需要删除 x 吗?如果我不这样做,会不会导致内存泄漏问题?

您似乎对指针和所指对象之间的区别感到困惑。 ax 是指针。想象一张写有派对地址的纸。

int *a = new int;在堆上分配一个新对象,并将地址赋给指针a。这就像在家里开派对,然后把地址写在一张名为 a.

的纸上

return a; returns 指向调用者的指针。这就像把 address-paper 交给叫你开派对的人。

*x = 10; 访问对象并修改它。这就像去纸上的地址,把傻帽传给别人,你就把它变成了化装舞会。

delete x; // do I need this? 是的,您需要删除您分配的对象。这表示“在本文的地址结束聚会”。


其他问题:

what if I don't delete memory? 然后聚会永远继续下去,其他人不能再在那个地址聚会,因为第一方还在继续。

what if I delete the memory twice? 两次结束派对毫无意义。可能什么都不会发生。否则它可能会烧毁。或者可能每次都不一样。

what if I use the pointer after deleting it? 去参加一个结束的聚会是没有意义的。也许什么都不会发生。或者也许有人用军事基地取代了房子,而你擅自闯入并被捕。或者可能每次都不一样。

what if I reassign the pointer without deleting? 如果你擦掉纸并在上面写一个新的地址,那对聚会没有任何影响。除了你可能永远不会再找到它之外,派对将永远持续下去。

I was told that members of classes are destroyed when the class is destroyed. Does that delete the object? 不,烧掉写有地址的那张纸并不能结束聚会。

此声明

delete x;

不删除指针 x 本身。它删除指针 x

指向的动态分配的内存
int *a = new int;

//...

int *x = createInt();

这条语句之后

delete x;

指针 x 将处于活动状态但将具有无效值。由于指针本身具有自动存储持续时间,因此它将在定义它的块作用域结束后自动销毁。

您应该始终删除动态分配的内存以避免内存泄漏。