问题标签 [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.

0 投票
1 回答
28 浏览

c++ - 是否有任何其他关键字可以使用全局命名空间范围解析运算符访问?

全局 new 和 delete 可以像平常一样使用,但你也可以在它们前面加上 :: 运算符,它的工作原理是一样的。是否有任何其他关键字具有相同的行为?

0 投票
2 回答
2613 浏览

c++ - std::list remove 在指针上调用删除?

由于我无法弄清楚的段错误,我在我的程序上运行了 valgrind。它在这里检测到一个问题...

删除是在这种方法...

我不认为从列表中删除指针会调用delete它。这里有什么可疑之处?如果您需要更多信息,请告诉我。

PS 以前在调试时,我注意到问题的发生是因为 GetTileX 和 GetTileY不是有效的索引,并且会返回像 13775864 这样的荒谬数字。我认为这与delete问题有关,并且删除或 push_back 导致了问题。

编辑:这是另一个代码片段

AdjustGridCoord 会使迭代器无效吗?

0 投票
3 回答
1855 浏览

c++ - 如果你删除一个对象,究竟会发生什么?(gcc) (当双重删除崩溃时?)

请注意,我不想解决我的问题的任何问题 - 我正在考虑事情发生的概率,因此想知道一些事情:

如果您删除对象并使用 gcc 作为编译器,究竟会发生什么?

上周我正在调查一次崩溃,其中竞争条件导致对象的双重删除。

调用对象的虚析构函数时发生崩溃,因为指向虚函数表的指针已经被覆盖。

虚函数指针是否被第一次删除覆盖?

如果不是,那么第二次删除是否安全,只要同时没有进行新的内存分配?

我想知道为什么我之前没有识别出我遇到的问题,唯一的解释是虚拟函数表在第一次删除期间被立即覆盖,或者第二次删除没有崩溃。

(第一个意味着如果“比赛”发生,崩溃总是发生在同一个位置 - 第二个,当比赛发生时通常什么都不会发生 - 并且只有在第三个线程覆盖删除对象时才会发生问题。 )


编辑/更新:

我做了一个测试,以下代码因段错误(gcc 4.4、i686 和 amd64)而崩溃:

如果我从 dtor 中删除“虚拟”,程序会被 glibc 中止,因为它检测到双重释放。对于“虚拟”,在对析构函数进行间接函数调用时会发生崩溃,因为指向虚拟函数表的指针无效。

在 amd64 和 i686 上,指针都指向一个有效的内存区域(堆),但是那里的值是无效的(一个计数器?它非常低,例如 0x11 或 0x21)所以编译器时的“调用”(或“jmp”做了返回优化)跳转到无效区域。

程序接收信号 SIGSEGV,

分段故障。0x0000000000000021

在 ??() (gdb)

#0 0x0000000000000021 在?? ()

#1 0x000000000040083e 在 main ()

所以在上面提到的条件下,指向虚函数表的指针总是被第一次删除覆盖,所以如果类有虚析构函数,下一次删除将跳转到必杀技。

0 投票
1 回答
704 浏览

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 保持不变。

0 投票
2 回答
6229 浏览

c++ - C++中的删除函数

看到一个使用函数的例子:cpp中的delete,没完全看懂。代码是:

该命令的确切操作是什么:delete[] p;

我认为目的是删除容器表中的所有指针。

中的括号delete[]给我一个线索,它删除了一个指向 Name 的指针数组,但没有指定数组的大小,那么析构函数如何“知道”要删除多少个指针?

0 投票
3 回答
2614 浏览

c++ - 在 C++ 中,调用删除运算符时会发生什么?

在 C++ 中,我理解delete操作符在与数组一起使用时会“破坏”它,释放它使用的内存。但是当这完成时会发生什么?

我想我的程序只会标记堆的相关部分被释放以供重用,然后继续。

但我也注意到,数组的第一个元素设置为 null,而其他元素保持不变。这是为了什么目的?

0 投票
4 回答
92607 浏览

c++ - 你如何在 C++ 中“重新分配”?

我怎样才能realloc在 C++ 中?语言中似乎缺少它 - 有newdelete没有resize

我需要它,因为当我的程序读取更多数据时,我需要重新分配缓冲区来保存它。我不认为deleteing 旧指针和newing 一个新的、更大的指针是正确的选择。

0 投票
7 回答
7625 浏览

c++ - 我可以通过 for_each 在 C++ 中的指针向量上调用“删除”吗?

假设我有一个std::vector<Obj *> objs(出于性能原因,我的指针不是实际Obj的)。

obj.push_back(new Obj(...));我反复填充它。

完成后,我必须delete推回元素。一种方法是这样做:

但是,如果我可以使用for_each算法来做同样的事情,我很感兴趣:

你怎么看?

0 投票
5 回答
853 浏览

c++ - C++ 继承:不调用析构函数

我的代码如下:

我的问题是 - 猜猜 - 我的服务器析构函数不会被调用......

我无法想象,为什么:/...(我将输出函数写入所有三个类并且服务器构造函数不输出任何内容,但其他两个都...在第二个之后!按键... (为什么是第二个而不是删除后?)

任何提示,提示,解决方案?...

我正在使用视觉工作室 2010

0 投票
2 回答
188 浏览

c++ - 关于清理堆的 C++ 约定的理论,建议的构建,是好的做法吗?

我有另一个理论问题,正如标题所暗示的那样,它是评估代码的构建。基本上我正在考虑在任何地方使用这个模板。

我正在使用 VC++ VS2008(全部包含在内)

斯塔佩尔.h

Stapel.cpp

这里的重点是清理方法,基本上我想将该方法放在我所有的文件中,并在需要时让它执行我的删除调用,以确保它都在一个地方,我可以防止删除飞来飞去,作为一个菜鸟,即使我知道可能也不是你想乱七八糟的东西,也不是草率的堆。

这个建筑怎么样?

好坏 ?为什么 ?

那么在这些任务中使用析构函数呢?