问题标签 [delete-operator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 是否有任何其他关键字可以使用全局命名空间范围解析运算符访问?
全局 new 和 delete 可以像平常一样使用,但你也可以在它们前面加上 :: 运算符,它的工作原理是一样的。是否有任何其他关键字具有相同的行为?
c++ - std::list remove 在指针上调用删除?
由于我无法弄清楚的段错误,我在我的程序上运行了 valgrind。它在这里检测到一个问题...
删除是在这种方法...
我不认为从列表中删除指针会调用delete
它。这里有什么可疑之处?如果您需要更多信息,请告诉我。
PS 以前在调试时,我注意到问题的发生是因为 GetTileX 和 GetTileY不是有效的索引,并且会返回像 13775864 这样的荒谬数字。我认为这与delete
问题有关,并且删除或 push_back 导致了问题。
编辑:这是另一个代码片段
AdjustGridCoord 会使迭代器无效吗?
c++ - 如果你删除一个对象,究竟会发生什么?(gcc) (当双重删除崩溃时?)
请注意,我不想解决我的问题的任何问题 - 我正在考虑事情发生的概率,因此想知道一些事情:
如果您删除对象并使用 gcc 作为编译器,究竟会发生什么?
上周我正在调查一次崩溃,其中竞争条件导致对象的双重删除。
调用对象的虚析构函数时发生崩溃,因为指向虚函数表的指针已经被覆盖。
虚函数指针是否被第一次删除覆盖?
如果不是,那么第二次删除是否安全,只要同时没有进行新的内存分配?
我想知道为什么我之前没有识别出我遇到的问题,唯一的解释是虚拟函数表在第一次删除期间被立即覆盖,或者第二次删除没有崩溃。
(第一个意味着如果“比赛”发生,崩溃总是发生在同一个位置 - 第二个,当比赛发生时通常什么都不会发生 - 并且只有在第三个线程覆盖删除对象时才会发生问题。 )
编辑/更新:
我做了一个测试,以下代码因段错误(gcc 4.4、i686 和 amd64)而崩溃:
如果我从 dtor 中删除“虚拟”,程序会被 glibc 中止,因为它检测到双重释放。对于“虚拟”,在对析构函数进行间接函数调用时会发生崩溃,因为指向虚拟函数表的指针无效。
在 amd64 和 i686 上,指针都指向一个有效的内存区域(堆),但是那里的值是无效的(一个计数器?它非常低,例如 0x11 或 0x21)所以编译器时的“调用”(或“jmp”做了返回优化)跳转到无效区域。
程序接收信号 SIGSEGV,
分段故障。0x0000000000000021
在 ??() (gdb)
#
0 0x0000000000000021 在?? ()
#
1 0x000000000040083e 在 main ()
所以在上面提到的条件下,指向虚函数表的指针总是被第一次删除覆盖,所以如果类有虚析构函数,下一次删除将跳转到必杀技。
c++ - C++ 标准在哪里说 ::delete 可以更改左值?
我遇到了我的第一个编译器,它更改了传递给 ::delete 的左值,但没有将左值清零。即以下情况属实:
请注意,删除操作后 p 不为零,并且它已从旧值更改。一位同事告诉我,在他使用一些将 p 更改为 0xFFFFFFFF 的大型机 C++ 编译器以及将 p 更改为 0 的其他编译器的经验中,这并不罕见。
C++ 标准中的什么地方说允许编译器执行此操作?
通过StackOverflow搜索,我发现了这个问题:为什么不删除将指针设置为NULL?其中有一个答案提到了Bjarne Stroustrup 的回应,其中包括以下声明:
C++ 明确允许删除的实现将左值操作数清零,我曾希望实现能够做到这一点,但这个想法似乎并没有在实现者中流行。
我已经阅读并重新阅读了最终委员会草案 C++0x 标准的第 5.3.5 和 12.5 节,但我没有看到“显式”部分。我只是在查看标准的错误部分吗?或者这些部分是否存在逻辑链,但我只是没有正确连接在一起。
我不再拥有 Annotated C++ Reference Manual 的副本。编译器可以在ARM中执行此操作吗?
[编辑:将部分参考从 3.5.3 更正为 5.3.5。我还添加了一个有趣的悖论作为 Henk 断言 p 在删除后未定义的对立面。]
如果将 p 初始化为 null,则会出现一个有趣的悖论。
但是,在这种情况下,该行为是有据可查的。当 delete 得到一个空指针时,它应该什么都不做,所以 p 保持不变。
c++ - C++中的删除函数
看到一个使用函数的例子:cpp中的delete,没完全看懂。代码是:
该命令的确切操作是什么:delete[] p;
?
我认为目的是删除容器表中的所有指针。
中的括号delete[]
给我一个线索,它删除了一个指向 Name 的指针数组,但没有指定数组的大小,那么析构函数如何“知道”要删除多少个指针?
c++ - 在 C++ 中,调用删除运算符时会发生什么?
在 C++ 中,我理解delete
操作符在与数组一起使用时会“破坏”它,释放它使用的内存。但是当这完成时会发生什么?
我想我的程序只会标记堆的相关部分被释放以供重用,然后继续。
但我也注意到,数组的第一个元素设置为 null,而其他元素保持不变。这是为了什么目的?
c++ - 你如何在 C++ 中“重新分配”?
我怎样才能realloc
在 C++ 中?语言中似乎缺少它 - 有new
但delete
没有resize
!
我需要它,因为当我的程序读取更多数据时,我需要重新分配缓冲区来保存它。我不认为delete
ing 旧指针和new
ing 一个新的、更大的指针是正确的选择。
c++ - 我可以通过 for_each 在 C++ 中的指针向量上调用“删除”吗?
假设我有一个std::vector<Obj *> objs
(出于性能原因,我的指针不是实际Obj
的)。
obj.push_back(new Obj(...));
我反复填充它。
完成后,我必须delete
推回元素。一种方法是这样做:
但是,如果我可以使用for_each
算法来做同样的事情,我很感兴趣:
你怎么看?
c++ - C++ 继承:不调用析构函数
我的代码如下:
我的问题是 - 猜猜 - 我的服务器析构函数不会被调用......
我无法想象,为什么:/...(我将输出函数写入所有三个类并且服务器构造函数不输出任何内容,但其他两个都...在第二个之后!按键... (为什么是第二个而不是删除后?)
任何提示,提示,解决方案?...
我正在使用视觉工作室 2010
c++ - 关于清理堆的 C++ 约定的理论,建议的构建,是好的做法吗?
我有另一个理论问题,正如标题所暗示的那样,它是评估代码的构建。基本上我正在考虑在任何地方使用这个模板。
我正在使用 VC++ VS2008(全部包含在内)
斯塔佩尔.h
Stapel.cpp
这里的重点是清理方法,基本上我想将该方法放在我所有的文件中,并在需要时让它执行我的删除调用,以确保它都在一个地方,我可以防止删除飞来飞去,作为一个菜鸟,即使我知道可能也不是你想乱七八糟的东西,也不是草率的堆。
这个建筑怎么样?
好坏 ?为什么 ?
那么在这些任务中使用析构函数呢?