#include <queue> using namespace std; class Test{ int *myArray; public: Test(){ myArray = new int[10]; } ~Test(){ delete[] myArray; } }; int main(){ queue<Test> q Test t; q.push(t); } 运行这个之后,我得到一个运行时错误“双免费或腐败”。 如果我摆脱了析构函数的内容( delete )它工作正常。 怎么了?
可以说我有这样的function: int main() { char* str = new char[10]; for(int i=0;i<5;i++) { //Do stuff with str } delete[] str; return 0; } 为什么我需要删除str如果我要结束程序呢? 如果我只是要退出,我不会在乎这个记忆是否到了一个充满独angular兽的地方,对吗? 这只是一个好习惯吗? 它有更深的后果吗?
我总是想知道为什么在删除之后指针自动设置为NULL不是标准的一部分。 如果这得到照顾,那么由于无效指针而导致的许多崩溃不会发生。 但是说了一下,我可以想一下为什么标准会限制这个原因的几个原因: 性能: 额外的指令可能会降低delete性能。 难道是因为const指针? 然后标准可能已经做了这个特殊的情况我猜。 有没有人知道不允许这个的确切原因?
在c++03中很明显,删除空指针没有效果。 事实上,在§5.3.5/2中明确指出: 在任何一种情况下,如果delete的操作数的值是空指针,则操作不起作用。 但是,在目前的草案为c++0x这个句子似乎缺less。 在草稿的其余部分,我只能find句子,说明如果delete-expression的操作数不是空指针常量会发生什么情况。 是删除仍然在c++0x定义的空指针,如果是的话,在哪里? 笔记: 有明显的间接证据表明它仍然是明确的。 首先,在§5.3.5/2有两个句子说明 在第一个替代(删除对象)中,删除操作数的值可能是空指针值,… 和 在第二种select(删除数组)中,删除操作数的值可能是空指针值或… 这些说操作数被允许为空,但它们自己并不真正定义如果是的话会发生什么。 其次,改变delete 0的含义是一个重大的突破性改变,标准委员会将不太可能做出这个特殊的改变。 此外,在c++0x草案的兼容性附件(附件C)中没有提到这是一个突破性的变化。 然而,附件C是一个信息性的部分,所以这对标准没有任何解释。 另一方面,删除空指针需要不起作用意味着额外的运行时检查。 在许多代码中,操作数不能为空,所以这个运行时检查与零开销原则相冲突。 也许委员会只是决定改变行为,使标准的c + +更符合语言设定的目标。
我怎样才能重新realloc在C + +? 这似乎是缺less的语言 – 有new和delete但不能resize ! 我需要它,因为随着我的程序读取更多的数据,我需要重新分配缓冲区来保存它。 我不认为delete旧的指针和new更大的指针是正确的select。
忽略编程风格和devise,调用堆栈上分配的variables是否是“安全的”? 例如: int nAmount; delete &nAmount; 要么 class sample { public: sample(); ~sample() { delete &nAmount;} int nAmount; }
C ++中的delete和delete[]操作符有什么区别?
删除空指针是否安全? 这是一个很好的编码风格?