我知道操作系统有时会使用某些模式(如0xCD和0xDD)初始化内存.我想知道的是何时以及为什么会发生这种情况.
这是否特定于编译器使用?
对于这个,malloc/new和free/delete的工作方式是否相同?
它是特定于平台的吗?
它会出现在其他操作系统上,例如Linux或VxWorks吗?
我的理解是这只发生在Win32调试配置中,它用于检测内存溢出并帮助编译器捕获异常.
你能举一个关于这个初始化如何有用的实际例子吗?
我记得读过一些东西(可能在Code Complete 2中),在分配内存时将内存初始化为已知模式是好的,某些模式会触发Win32中的中断,这将导致调试器中出现异常.
这有多便携?
在答案/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)