在同一个指针上多次使用"new"

Hil*_*ton 5 c++

当我做类似的事情时会发生什么

   int * ptr = new int; 
   *ptr = 5;
   // ... do some stuff here
   ptr = new int; 
   // ... reuse ptr to do some other stuff
Run Code Online (Sandbox Code Playgroud)

而不是

   int * ptr1 = new int; 
   *ptr1 = 5;
   // ... do some stuff here
   delete ptr1;
   int * ptr2 = new int; 
   // ... use ptr2 now
Run Code Online (Sandbox Code Playgroud)

????

在硬件级别发生同样的事情吗?换句话说,在第一种情况下,是否ptr = new int;继续从其先前的指针/值对继续,以及那些旧值会发生什么?它们是否被替换,它们只是漂浮在某个地方等等?

coy*_*508 10

int *ptr只是一个存储地址的变量,仅此而已.

在第一次之后int * ptr = new int;,它包含动态分配的整数的地址.在您的第二个之后int * ptr = new int;,它包含另一个动态分配的整数的地址.

然后发生的事情并不特别,唯一的事情是你没有调用,delete因此永远不会释放为第一个整数分配的内存.没有什么可以跟踪它,它的地址不存储在任何地方,因此它将在程序结束之前保持无用的分配空间.


Chr*_*phe 7

在第一个示例中,指针被覆盖,但它指向的对象仍然存在并且在某处"浮动".这会导致内存泄漏.

如果在常用功能或循环中发生这种情况,您可能很容易耗尽内存,存储您不能再也不会访问的值.

泄漏实际上是一个非常常见的错误.一个好的做法是通过使用智能指针来避免它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    
Run Code Online (Sandbox Code Playgroud)