我有一个指向数组的指针和另一个引用相同数组的指针。如何删除这些指针中的任何一个而不杀死数组,以便第二个未删除的指针仍然有效?
例如:
int* pointer1 = new int [1000];
int* pointer2;
pointer2 = pointer1;
现在我想摆脱指针1,我怎么做才能继续通过指针2继续访问数组呢?
答案 0 :(得分:12)
那些指针在堆栈上;你不必删除它们。只需忽略pointer1
,它就会在块的末尾消失。
答案 1 :(得分:10)
让它超出范围?
你没有'删除'指针,你删除了他们指向的内容。因此,如果您只想删除变量'pointer1',那么唯一的方法就是创建它所终止的范围。
答案 2 :(得分:10)
您根本没有将指针传递给delete
。你只是停止使用该指针。如果要确保不再通过该指针访问该数组,可以将其设置为null。
C和C ++不会跟踪指向对象或数组的指针数量。如果您想要引用计数,则需要使用引用计数容器,例如shared_ptr
,或者在这种情况下,shared_array
(您可以在Boost中找到这两个容器,很可能是实现已在<memory>
命名空间或std
中的std::tr1
中包含它们。
答案 3 :(得分:4)
当您静态声明带有int* pointer1;
的指针时,无法释放它。您只能释放使用new
,malloc
等分配的动态分配的内存。“摆脱”pointer1
的唯一方法是让它超出范围,例如当函数返回时。如果您已完成使用pointer1
并希望防止意外地使用它来更改阵列,请使用pointer1 = NULL;
。
答案 4 :(得分:4)
通常,为了使指针“安全”,只需将其设置为NULL,这使得它根本不指向任何内容。或者你可以让它超出范围。
例如,如果你有两个指针。
int *a = new int;
int *b = a;
// somewhere
b = NULL;
delete b; // does nothing now
delete a; // deletes a
或者你可以让它超出范围。
int *a = new int;
{
int *b = a;
// blah blah blah
}
// don't have to worry about b
delete a;
答案 5 :(得分:3)
它是一个堆栈变量(你编写它的方式)并因此绑定到你声明它的范围。一旦你达到该特定范围的结束花括号,它将被清理而无需你做任何事情关于它。
如果你想确保其他任何东西都不能再使用pointer1,你可以在完成后设置pointer1=NULL
。
答案 6 :(得分:1)
int** pointer1 = new int *;
* pointer1 = new int [1000];
int* pointer2;
pointer2 = * pointer1;
delete pointer1;
答案 7 :(得分:1)
只需忽略指针,当你完成功能或阻止时它就会消失。请记住,一旦你不再指向某个东西,就无法访问它。当然,它仍将存在耗尽内存,但你无法实现它。所以,在你考虑放开指针之前,确保你在某个地方有另一个指向它的指针,或者你摆脱它。