在C ++中删除一个指针
背景:我试图围绕着指针,几周前我们刚刚在学校看到他们,而今天练习时,我碰到一个愚蠢的? 问题,它可以是超级简单的,但我几乎没有编程经验。
我已经看到了很多有关删除指针的问题,但它们似乎都与删除类而不是“简单”指针(或任何适当的术语)有关,下面是我正在尝试的代码跑:
#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号真的有用吗? 似乎工作给我,指针不再存储地址,这是删除指针的正确方法?
对不起,很长的一个问题,想尽可能的清楚,也要重申一下,我有一点编程经验,所以如果有人能用通俗的话来回答这个问题的话,将不胜感激!
1&2
myVar = 8; //not dynamically allocated. Can't call delete on it. myPointer = new int; //dynamically allocated, can call delete on it.
第一个variables被分配在堆栈上。 您可以使用new
运算符仅在您dynamic分配的内存上调用delete(在堆上)。
3。
myPointer = NULL; delete myPointer;
上面什么也没做。 你没有释放任何东西,因为指针指向NULL。
以下不应该这样做:
myPointer = new int; myPointer = NULL; //leaked memory, no pointer to above int delete myPointer; //no point at all
你指向NULL,留下泄漏的内存(你分配的新的int)。 你应该释放你指向的记忆。 没有办法访问分配的new int
,因此内存泄漏。
正确的方法是:
myPointer = new int; delete myPointer; //freed memory myPointer = NULL; //pointed dangling ptr to NULL
更好的方法:
如果您使用的是C ++, 请不要使用原始指针。 使用智能指针,而不需要额外的开销,可以为您处理这些事情。 C ++ 11自带了几个 。
我相信你不完全理解指针如何工作。
当你有一个指向内存的指针时,你需要明白三个不同的东西:
– 指针(内存)有“指向”
– 这个内存地址
– 并非所有指针都需要删除其内存:只需要删除dynamic分配的内存(使用new
操作符)。
想像:
int *ptr = new int; // ptr has the address of the memory. // at this point, the actual memory doesn't have anything. *ptr = 8; // you're assigning the integer 8 into that memory. delete ptr; // you are only deleting the memory. // at this point the pointer still has the same memory address (as you could // notice from your 2nd test) but what inside that memory is gone!
当你做到了
ptr = NULL; // you didn't delete the memory // you're only saying that this pointer is now pointing to "nowhere". // the memory that was pointed by this pointer is now lost.
C ++允许你尝试delete
一个指向null
的指针,但它实际上并没有做任何事情,只是不会给出任何错误。
指针与正常variables类似,您不需要删除它们。 它们在函数执行结束时和/或程序结束时从内存中移除。
但是,您可以使用指针来分配“块”的内存,例如像这样:
int *some_integers = new int[20000]
这将为20000个整数分配内存空间。 有用的,因为堆栈有一个有限的大小,你可能想要大量的'ints'没有堆栈溢出错误。
每当你调用new时,你应该在你的程序结束时'删除',否则你会得到一个内存泄漏,并且一些分配的内存空间永远不会被其它程序使用。 去做这个:
delete [] some_integers;
希望有所帮助。
在C ++中有一个规则,每个新的都有一个删除 。
- 为什么第一个案件不能工作? 看起来最直接的用法是使用和删除一个指针? 错误说内存没有被分配,但'cout'返回一个地址。
新不会被称为。 因此,cout打印的地址是myVar的内存位置的地址,或者在这种情况下分配给myPointer的值。 通过写作:
myPointer = &myVar;
你说:
myPointer = myVar中的数据存储位置
- 在第二个例子中,错误没有被触发,但是执行myPointer的值仍然返回一个内存地址?
它返回一个指向已被删除的内存位置的地址。 因为首先创build指针并将其值分配给myPointer,然后将其删除,然后将其打印出来。 所以除非你给myPointer赋值,否则删除的地址将会保留。
- 3号真的有用吗? 似乎工作给我,指针不再存储地址,这是删除指针的正确方法?
NULL等于0,你删除0,所以你什么都不删除。 这是逻辑,它打印0,因为你做到了:
myPointer = NULL;
这等于:
myPointer = 0;
- 您正尝试删除堆栈中分配的variables。 你不可以做这个
- 删除一个指针实际上不会破坏一个指针,只是将占用的内存返回给操作系统。 您可以访问它,直到内存被用于另一个variables,否则操作。 所以删除后最好将指针设置为NULL(0)。
- 删除一个NULL指针不会删除任何内容。
int value, *ptr; value = 8; ptr = &value; // ptr points to value, which lives on a stack frame. // you are not responsible for managing its lifetime. ptr = new int; delete ptr; // yes this is the normal way to manage the lifetime of // dynamically allocated memory, you new'ed it, you delete it. ptr = nullptr; delete ptr; // this is illogical, essentially you are saying delete nothing.