当我做
之类的事情时会发生什么 int * ptr = new int;
*ptr = 5;
// ... do some stuff here
ptr = new int;
// ... reuse ptr to do some other stuff
而不是
int * ptr1 = new int;
*ptr1 = 5;
// ... do some stuff here
delete ptr1;
int * ptr2 = new int;
// ... use ptr2 now
????
硬件级别是否会发生同样的事情?换句话说,在第一种情况下,ptr = new int;
是否从其先前的指针/值对移开,以及那些旧值会发生什么?他们会被替换,他们只是漂浮在某个地方等等吗?
答案 0 :(得分:9)
您的int *ptr
只是一个存储地址的变量,仅此而已。
在您的第一个int * ptr = new int;
之后,它包含动态分配的整数的地址。在您的第二个int * ptr = new int;
之后,它包含另一个动态分配的整数的地址。
接下来发生的事情并不特别,唯一的问题是你没有调用delete
所以分配给第一个整数的内存永远不会被释放。没有什么可以跟踪它,它的地址没有存储在任何地方,所以它将一直无用的分配空间,直到程序结束。
答案 1 :(得分:7)
在第一个例子中,指针被覆盖,但是它指向的对象仍然存在并且在#34;周围浮动。某处。这会导致memory leaking。
如果在频繁使用的功能或循环中发生这种情况,您可能会轻易耗尽记忆力,存储您无法再也无法访问的值。
泄漏事实上是一个非常常见的错误。 good practice是通过使用shared_ptr
等智能指针来避免它。它们跟踪使用次数,并在不再使用时自动释放对象。例如:
shared_ptr<int> ptr = make_shared<int>(); // allocate an int
*ptr = 5;
// ... do some stuff here
ptr = make_shared<int>(); // the old object is no longer used so deleted automatically
// ... reuse ptr to do some other stuff