上下文:我试图围绕着指针,几周前我们在学校看到了他们,而在今天练习时,我遇到了一个愚蠢的问题?问题,它对你来说可能是非常直接的,但我几乎没有任何编程经验。在C++中删除一个指针
我看过很多关于删除指针的问题,但它们似乎都与删除类而不是“简单”指针(或任何适当的术语可能)有关,下面是代码I “M试图运行:
#include <iostream>;
using namespace std;
int main() {
int myVar,
*myPointer;
myVar = 8;
myPointer = &myVar;
cout << "delete-ing pointers " << endl;
cout << "Memory address: " << myPointer << endl;
// Seems I can't *just* delete it, as it triggers an error
delete myPointer;
cout << "myPointer: " << myPointer << endl;
// Error: a.out(14399) malloc: *** error for object 0x7fff61e537f4:
// pointer being freed was not allocated
// *** set a breakpoint in malloc_error_break to debug
// Abort trap: 6
// Using the new keyword befor deleting it works, but
// does it really frees up the space?
myPointer = new int;
delete myPointer;
cout << "myPointer: " << myPointer << endl;
// myPointer continues to store a memory address.
// Using NULL before deleting it, seems to work.
myPointer = NULL;
delete myPointer;
cout << "myPointer: " << myPointer << endl;
// myPointer returns 0.
}
所以我的问题是:
- 为什么不会第一种情况的工作?看起来最直接的用法是使用和删除一个指针?错误表示内存未分配,但'cout'返回了一个地址。
- 在第二个示例中,错误未被触发,但是执行myPointer 仍然的值的返回内存地址?
- 3号真的有用吗?似乎工作给我,指针不再存储地址,这是删除指针的正确方法?
对不起,我想让这个尽可能的清晰,也要重申一下,我没有什么编程经验,所以如果有人能够用通俗的话来回答这个问题,那将不胜感激!
你没有看到第一个例子的原因是因为它是错误的。只有'删除'你'新'。指针在删除它之后将其自身设置为NULL也不是必需的。如果您想在那里安全,请使用智能指针,这会为您释放内存,并在您尝试访问内存时发生错误,因为这些内存不包含内容。 – chris
嗯好吧,我不确定什么是智能指针,但我会研究它,谢谢! – leopic
简而言之,他们按照我所描述的来做。为了保持新的东西,你可以调用'reset'并且释放旧的。要免费更换,请致电'release'。当它超出范围时,它就会被销毁,并且可以根据它的类型释放内存。 'std :: unique_ptr'仅适用于一个所有者。当最后一个拥有者停止拥有资源时,'std :: shared_ptr'释放它。他们也是例外安全的。如果您使用一个资源分配资源,然后遇到异常,资源将被正确释放。 – chris