2017-07-14 94 views
0

我必须使用运算符delete作为堆栈指针吗?C++使用操作符删除自动(堆栈)指针

例如:

User * p = new User; 
delete p;    //needed? 
+2

总是'delete'用'new'分配的内容。指针在栈上,但它指向的对象不是。 'delete p;'会删除指向的对象,而不是指针本身。您可以使用['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)或['std :: shared_ptr'](http:// en。 cppreference.com/w/cpp/memory/shared_ptr)。 –

+0

您并未删除指针。您正在删除已分配的动态内存。其地址碰巧存储在自动指针变量中的事实是无关紧要的。 –

+0

'stack'标签用于数据结构'stack'。 C++作为一种语言不一定需要堆栈来存储具有自动存储持续时间的对象。 –

回答

2

当您使用delete你是不是删除指针,所以它没有什么区别它是否是一个堆栈指针或任何其他类型的指针。

当您使用delete时,您正在删除指针指向的内存块。如果该块被分配了new,那么它总是在堆上。 (如果不是用new分配的,那么你不应该delete它。)

+0

尽管答案的基调是正确的,但所提供的示例非常不正确。通过同样的逻辑,'delete p'调用后'printf(“%d”,* p);'很可能会打印出相同的未改变的值(因为p是'int *'),所以它意味着'delete p'什么都不做? – SergeyA

+0

@SergeyA我从我的答案中删除了这个例子,让你开心。 –

1

另一个角度是没有,你不得使用运营商delete,因为你永远不应该在非库代码使用明火的指针。

在现代C++中,你的榜样应该是:

std::unique_ptr<User> p = std::make_unique<User>(); 

没有delete和看不到new

注意:在这种情况下,颗粒,make_unique可以代替new怕疼,但由于在其他例子可能不是,这是一个很好的做法,自学 - make_unique是使用功能。