2010-05-07 36 views
6

我有一个指针指向一个数组和另一个指向相同数组的指针。如何删除这些指针中的任何一个而不杀死数组,使第二个未删除的指针仍然有效?如何在不删除指针指向的数据的情况下删除指针?

例如:

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

现在我想摆脱指针1的,我如何做到这一点,这样我可以继续通过指针1 normaly访问阵列?

回答

10

这些指针位于堆栈上;你不必删除它们。只需忽略pointer1,它将在块的末尾消失。

+1

啊这解释了它对我来说最好。所以指针只是栈上的一个变量,这是有道理的。所以这意味着它不能被超出范围访问,我不会意外地在范围外使用它并导致问题。好的谢谢。 – Faken 2010-05-07 20:46:53

+2

@ Faken-要清楚,“指针只是栈上的一个变量”并不是真实的陈述。您的代码示例中的指针是一个堆栈变量,因为您是静态声明的。正如Neil Butterworth在他的例子中显示的那样,指针也可以动态地声明。这完全取决于你如何声明它,对象是指针没有什么特别之处。 – bta 2010-05-07 20:50:29

+3

@bta:我没有看到任何静态声明。也许你的意思是“自动”,即实际的术语。 (也就是说,事物不是堆栈分配的,但它们是自动分配的。) – GManNickG 2010-05-07 20:56:45

9

让它超出范围?

你不'删除'指针,你删除他们指向的东西。所以如果你只是想摆脱变量'pointer1',唯一的办法就是创建它的范围被终止。

9

根本不会将该指针传递给delete。你只是停止使用该指针。如果你想确保你不再通过那个指针访问数组,你可以将它设置为null。

C和C++不会跟踪有多少指针指向一个对象或一个数组。如果您需要引用计数,则需要使用引用计数的容器,如shared_ptr,或者在这种情况下为shared_array(您可以在Boost中找到这两个容器,并且很有可能您的实现已将它们存储在<memory>之内std名称空间或std::tr1)。

1
int** pointer1 = new int *; 
* pointer1 = new int [1000]; 
int* pointer2; 
pointer2 = * pointer1; 
delete pointer1; 
+0

嘿,你过去对我很有帮助,但这次你只是把我弄糊涂了,嘿。 – Faken 2010-05-07 20:48:14

+2

@Faken认为它是一个禅课:-)基本上,正如其他人指出的那样,你问的问题没有太大意义。 – 2010-05-07 20:51:37

+0

@ Faken-他向你展示了如果你想要删除指针,你必须要做的事情。他创建了一个“指针指针”,并为其指定了通过“new”创建的“int *”的地址。由于'pointer1'在这种情况下是动态分配的,因此一旦完成后就可以“释放”它。这个解决方案的复杂性可能表明您需要重新考虑是否真的需要删除指针。 – bta 2010-05-07 20:55:01

3

这是一个堆栈变量,因此必将给您宣布它的范围(你写的方式)。一旦你点击那个特定范围的右大括号,它会被清理没有你必须做任何事情。

如果您想确保没有其他东西可以再使用指针1,则可以在完成后设置pointer1=NULL

4

当你静态声明一个指针与int* pointer1;,你的不能免费它。您只能释放使用new,malloc等分配的动态分配的内存。“摆脱”pointer1的唯一方法是让它超出范围,例如函数返回时。如果您使用pointer1完成并且想要防止它意外地用于更改阵列,请使用pointer1 = NULL;

1

只要忽略指针,当你完成你的函数或块时它就会消失。只要记住,一旦你不再有指向某个东西的指针,它就不能被访问。当然,它仍然会在那里使用内存,但是你将无法得到它。因此,在考虑放弃指针之前,请确保您在某个地方有另一个指针,或者您将其清除。

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; 
+0

'b = NULL;删除b'做什么?它被定义了吗?我的印象是,这是一些错误或未定义的行为。 – 2010-05-08 09:31:02

+0

@Nathan:'foo = NULL;删除foo;'完全合法且无害。意味着您在删除之前不必始终查找非NULL值。 – 2010-05-08 19:20:22