如何在不删除指针指向的数据的情况下删除指针?

时间:2010-05-07 20:40:36

标签: c++ pointers

我有一个指向数组的指针和另一个引用相同数组的指针。如何删除这些指针中的任何一个而不杀死数组,以便第二个未删除的指针仍然有效?

例如:

int* pointer1 = new int [1000];
int* pointer2;
pointer2 = pointer1;

现在我想摆脱指针1,我怎么做才能继续通过指针2继续访问数组呢?

8 个答案:

答案 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;的指针时,无法释放它。您只能释放使用newmalloc等分配的动态分配的内存。“摆脱”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)

只需忽略指针,当你完成功能或阻止时它就会消失。请记住,一旦你不再指向某个东西,就无法访​​问它。当然,它仍将存在耗尽内存,但你无法实现它。所以,在你考虑放开指针之前,确保你在某个地方有另一个指向它的指针,或者你摆脱它。