当我做类似的事情时会发生什么
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因此永远不会释放为第一个整数分配的内存.没有什么可以跟踪它,它的地址不存储在任何地方,因此它将在程序结束之前保持无用的分配空间.
在第一个示例中,指针被覆盖,但它指向的对象仍然存在并且在某处"浮动".这会导致内存泄漏.
如果在常用功能或循环中发生这种情况,您可能很容易耗尽内存,存储您不能再也不会访问的值.
泄漏实际上是一个非常常见的错误.一个好的做法是通过使用智能指针来避免它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)
| 归档时间: |
|
| 查看次数: |
2411 次 |
| 最近记录: |