在答案/sf/answers/49319791/中,引用了Stroustrup:
C++显然允许delete的实现将左值操作数归零,我曾希望实现会这样做,但这个想法似乎并没有受到实现者的欢迎.
但是,我没有在标准中找到这个明确的陈述.目前的标准草案(N4659)中有一部分可以用这种方式解释:
6.7:
当达到存储区域的持续时间结束时,表示该存储区域的任何部分的地址的所有指针的值变为无效指针值(6.9.2).通过无效指针值间接并将无效指针值传递给释放函数具有未定义的行为.对无效指针值的任何其他使用都具有实现定义的行为.
脚注:某些实现可能会定义复制无效指针值会导致系统生成的运行时错误
因此,在a之后delete ptr;,ptrs值变为无效指针值,并且使用此值具有实现定义的行为.但是,它并没有说ptr允许改变价值.
这可能是一个哲学问题,如果一个人不能使用它的价值,怎么能决定一个价值发生了变化呢?
6.9:
对于普通可复制类型T的任何对象(基类子对象除外),无论对象是否保持类型T的有效值,构成对象的基础字节(4.4)都可以复制到char数组中, unsigned char,或std :: byte(21.2.1).43如果将该数组的内容复制回对象,该对象应随后保持其原始值.
所以,似乎它对memcpy一个char数组的无效指针值是有效的(取决于哪个语句是"更强",6.7或6.9.对我来说,6.9似乎更强).
这样,我可以通过以下方式检测到指针值已被改变delete:memcpy指向deleteto char数组之前和之后的值,然后比较它们.
所以,据我所知,6.7 delete不允许允许修改其参数.
是否允许删除修改其参数?
看看这里的评论:https: //stackoverflow.com/a/45142972/8157187
这是一个不太可能但仍然可能的现实世界代码,其中重要的是:
SomeObject *o = ...; // We have a SomeObject
// This SomeObject is registered into someHashtable, with its memory address
// The hashtable interface is C-like, it handles opaque keys (variable length unsigned char arrays)
delete o; …Run Code Online (Sandbox Code Playgroud) 在阅读了很多关于此的帖子后,我想澄清下一点:
A* a = new A();
A* b = a;
delete a;
A* c = a; //illegal - I know it (in c++ 11)
A* d = b; //I suppose it's legal, is it true?
Run Code Online (Sandbox Code Playgroud)
所以问题是关于使用已删除指针的副本的值.
我读过,在c ++ 11中读取a导致未定义行为的价值 - 但是读取它的价值b呢?
尝试读取指针的值(注意:这与解除引用它不同)会导致自C++ 14以来的实现定义行为,其中可能包括生成运行时错误.(在C++ 11中它是未定义的行为) 删除后指针本身会发生什么?
在2011年之前有一个类似的问题:标准委员会关心的异域架构
现在,我想问一个非常相似的问题,但这一次,我是从程序员的角度和C++ 11的角度来看问题.
目前存在哪些硬件,它有一个C++ 11编译器,可以被认为是异国情调?
我认为异国情调?
所以我们在x86/ARM世界看到的任何不是标准的东西,我们在那里:
注意:我想得到答案,其中硬件存在符合C++ 11标准的编译器,而不存在C++编译器,但不完全符合.
我问这个,因为很多时候,我得到的答案就像"你不能依赖它,它是实现定义的",而且我想知道,实际上,在现实世界中,我可以依赖多少在标准上.举个例子:每当我写作时std::uint16_t,我可能会担心(因为这个功能是可选的),在平台上,这种类型是不存在的.但是,是否存在这种类型不存在的实际平台?
我对 C++ 中指针的行为有点好奇。所以我有这个小程序要测试,不幸的是它运行良好。
#include <iostream>
class Test{
public:
Test(){
std::cout<<"Test Created!\n";
}
~Test(){
std::cout<<"Test Destroyed!\n";
}
};
void destroyer(Test* T){
Test* temp = T;
delete temp;
}
int main(){
Test* ptr = new Test();
destroyer(ptr);
}
Run Code Online (Sandbox Code Playgroud)
它给予回报
Test Created!
Test Destroyed!
Run Code Online (Sandbox Code Playgroud)
而且我得出的结论是,当我们删除一个指针时,实际上只是删除了指针所指的对象,而不是变量本身(变量指针会在程序结束时自动删除,与其他原始数据类型相同)。我的想法是真的吗?