如果您动态分配一些空间,例如
struct node*py=new struct node;
struct node*tr=py;
delete py;
不应该分配的内存仍然保留并且不会被释放,因为在删除原始指针之前我有另一个指向同一地址的指针吗?
答案 0 :(得分:4)
没有。这根本不是内存分配在C ++中的工作方式。
如果您使用new
分配内存,然后在其上调用delete
,则 将被删除。内存管理器无法在删除开始时取消或中止删除。 C ++倾向于完全按照你的要求去做,所以如果你真的不想释放一些内存,那么就不要在它上面调用delete
。
如果您想要引用计数,请尝试使用std::shared_ptr
(或boost::shared_ptr
,如果您还没有std
中的那个)。
答案 1 :(得分:4)
不,堆管理器只是执行它所说的内容并释放内存。
如果你想根据你对内存的引用数量来保留内存,那么考虑使用引用计数指针,例如C ++ 11 shared_ptr(参见,例如Dr Dobbs)或boost {{ 3}}
答案 2 :(得分:2)
但是你自己说了 - 它只是一个指针,所以它不知道它指向什么。它只是指向蒙着眼睛的地方。
答案 3 :(得分:1)
不,在c / c ++中,编译器/执行环境不会跟踪对使用中的内存,新标记和空闲标记内存的引用,并且任何引用计数或其他更高阶的垃圾收集都会留给您的程序