背景:我试图围绕指针,我们几周前在学校看到它们,今天练习时我遇到了傻瓜?问题,对你来说可能非常简单,但我几乎没有编程经验.
我在SO中看到了很多关于删除指针的问题,但它们似乎都与删除一个类有关,而不是一个"简单"指针(或任何正确的术语),这里是我试图的代码跑:
#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 …Run Code Online (Sandbox Code Playgroud) 我怎么能用reallocC++?它似乎在语言中缺失 - 有new,delete但不是resize!
我需要它,因为当我的程序读取更多数据时,我需要重新分配缓冲区来保存它.我不认为delete旧指针和new新的更大的指针是正确的选择.
在c++03它是很清楚,删除一个空指针没有任何效果.实际上,它明确指出§5.3.5/2:
在任一替代方案中,如果delete的操作数的值是空指针,则操作无效.
然而,在目前的草案对于c++0x这句话似乎缺少.在草稿的其余部分,我只能找到句子,说明如果delete-expression的操作数不是空指针常量会发生什么.是否删除仍然定义的空指针c++0x,如果是,在哪里?
笔记:
有大量的间接证据表明它仍然有明确的定义.
首先,有两句话§5.3.5/2说明
在第一个替代(删除对象)中,delete的操作数的值可以是空指针值,...
和
在第二个替代(删除数组)中,delete的操作数的值可以是空指针值或...
这些说操作数被允许为空,但是它们自己实际上并没有定义如果是的话会发生什么.
其次,改变意义delete 0是一个重大的突破性变化,标准委员会不太可能做出这种特殊的改变.此外,没有提到这是c++0x草案兼容性附件(附件C)的重大变化.但是,附件C是一个信息性部分,因此对标准没有任何解释.
另一方面,删除空指针要求无效的事实意味着额外的运行时检查.在很多代码中,操作数永远不能为空,因此这个运行时检查与零开销原则相冲突.也许委员会刚刚决定改变行为,使标准c ++更符合语言的既定设计目标.
为什么要一个会替换默认的操作new和delete使用自定义new和delete运营商?
这是继续重载新的和删除在非常有启发性的C++ FAQ:
运算符重载.
本FAQ的后续条目是:
我应该如何编写符合ISO C++标准的自定义new和delete运算符?
注意:答案基于Scott Meyers的"更有效的C++"课程.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
c++ operator-overloading c++-faq new-operator delete-operator
new和delete运算符?这是在延续重载new和delete在非常照明C++ FAQ,操作符重载,以及其后续,一个为什么要更换默认的new和delete操作?
第1部分:编写符合标准的new运算符
第2节:编写符合标准的delete运算符
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法首先开始,所以你的答案很可能被那些提出想法的人阅读.)
注意:答案是基于Scott Meyers的学习'更有效的C++和ISO C++标准.
c++ operator-overloading c++-faq new-operator delete-operator
C ++ 20 引入了“销毁operator delete”:operator delete采用标记类型std::destroying_delete_t参数的新重载。
这到底是什么,什么时候有用?
忽略编程风格和设计,在堆栈上分配的变量上调用delete是"安全的"吗?
例如:
int nAmount;
delete &nAmount;
Run Code Online (Sandbox Code Playgroud)
要么
class sample
{
public:
sample();
~sample() { delete &nAmount;}
int nAmount;
}
Run Code Online (Sandbox Code Playgroud) 根据N3290 std::unique_ptr在其构造函数中接受一个删除参数.
但是,我不能在Windows中使用Visual C++ 10.0或MinGW g ++ 4.4.1,也不能在Ubuntu中使用g ++ 4.6.1.
因此,我担心我对它的理解是不完整或错误的,我不能看到显然被忽略的删除论证的观点,那么任何人都可以提供一个有效的例子吗?
我最好还想看看它是如何工作的unique_ptr<Base> p = unique_ptr<Derived>( new Derived ).
可能会使用标准中的一些措辞来备份示例,即使用您正在使用的任何编译器,它实际上做了它应该做的事情?
#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);
}
Run Code Online (Sandbox Code Playgroud)
运行此操作后,我收到运行时错误"double free or corruption".如果我摆脱析构函数内容(delete),它工作正常.怎么了?
我经常NULL在删除指针之前看到遗留代码检查,类似于
if (NULL != pSomeObject)
{
delete pSomeObject;
pSomeObject = NULL;
}
Run Code Online (Sandbox Code Playgroud)
NULL在删除之前有没有理由检查指针?NULL之后设置指针的原因是什么?
c++ ×10
delete-operator ×10
new-operator ×3
c++-faq ×2
null ×2
pointers ×2
c++11 ×1
c++20 ×1
destroy ×1
destructor ×1
heap ×1
realloc ×1
stack ×1
unique-ptr ×1