我是否需要删除在堆中创建的堆栈中的指针?
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 吗?如果我不这样做,会不会导致内存泄漏问题?
您似乎对指针和所指对象之间的区别感到困惑。 a
和 x
是指针。想象一张写有派对地址的纸。
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 将处于活动状态但将具有无效值。由于指针本身具有自动存储持续时间,因此它将在定义它的块作用域结束后自动销毁。
您应该始终删除动态分配的内存以避免内存泄漏。
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 吗?如果我不这样做,会不会导致内存泄漏问题?
您似乎对指针和所指对象之间的区别感到困惑。 a
和 x
是指针。想象一张写有派对地址的纸。
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 将处于活动状态但将具有无效值。由于指针本身具有自动存储持续时间,因此它将在定义它的块作用域结束后自动销毁。
您应该始终删除动态分配的内存以避免内存泄漏。