几个问题:
我在 www.cprogramming.com 上查看链表的以下代码:
struct node {
int x;
node *next;
};
int main()
{
node *root; // This will be the unchanging first node
root = new node; // Now root points to a node struct
root->next = 0; // The node root points to has its next pointer
// set equal to a null pointer
root->x = 5; // By using the -> operator, you can modify the node
// a pointer (root in this case) points to.
}
这段代码会不会导致[小]内存泄漏,因为他从不在最后删除 root?
此外,如果“节点”是类而不是结构,这会有什么不同吗?
最后,对于这段代码:
#include <iostream>
using namespace std;
class A
{
public:
A(){}
void sing()
{ cout << "TEST\n";}
};
int main()
{
A *a = new A();
a->sing();
return 0;
}
- 我必须在退出 main 之前删除 A 吗?
- 在什么情况下我会使用
A *a = new A()
还是使用A a = A()
?
最佳答案
1.1 是的,尽管在任何现代操作系统上,当进程结束时,它的所有内存都会被操作系统回收。内存泄漏对于长期存在的进程来说是一个大问题,内存继续泄漏并且进程无缘无故地继续请求更多内存。
1.2 我想你的意思是 class
,而不是对象(对象是类或结构的实例化)...仍然没有区别,class
和 struct
的区别仅在于它们的默认访问说明符(public
用于 struct
,private
用于 类
es)。
2.1 是(与 1.1 中的警告相同)。
2.2 通常当 (a) A
太大而无法放入堆栈时,(b) 当局部变量强加的对象生命周期(=在作用域结束时自动销毁)是不合适,(c) 当要创建的对象数量在编译时未知时。
例子:
一个。 A
在其定义中包含一个非常大的矩阵,这会占用大量堆栈空间;或者,A
并不大,但是当前调用是递归的,所以放到栈中很可能会导致栈溢出。
A
是一个要从此函数返回的对象(不能接受拷贝);或者,A
将在此函数中创建,并在将来由其他函数删除,但不会在当前范围的末尾删除。
A
是链表的节点,由用户提供的数据填充;您在循环中创建并附加节点,直到用户提供的数据结束。
关于c++ - C++中删除对象和new关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16888751/