问题标签 [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 投票
4 回答
630 浏览

c++ - 为什么无法访问 new[]'d 数组的大小?

使用 分配数组时new [],为什么不能从指针中找出该数组的大小?它必须在运行时知道,否则delete []不知道要释放多少内存。

除非我错过了什么?

0 投票
6 回答
129159 浏览

c++ - C++ 中的 delete vs delete[] 运算符

C ++中的delete和运算符有什么区别?delete[]

0 投票
4 回答
2837 浏览

c++ - 在 C++ 中清理对象的动态数组

我对在 C++ 中处理对象数组有点困惑,因为我似乎无法找到有关它们如何传递(引用或值)以及它们如何存储在数组中的信息。

我希望一个对象数组是一个指向该对象类型的指针数组,但我还没有发现这个写在任何地方。它们会是指针,还是对象本身会以数组的形式排列在内存中?

在下面的示例中,自定义类 myClass 包含一个字符串(这是否会使其具有可变大小,或者字符串对象是否包含指向字符串的指针,因此占用了一致的空间量。我尝试创建一个动态数组myContainer 中的 myClass 对象。在 myContainer.addObject() 方法中,我尝试创建一个更大的数组,将所有对象与新对象一起复制到其中,然后删除旧对象。我完全不相信我我用我的析构函数正确清理我的内存——我可以在这方面做些什么改进?

0 投票
5 回答
103022 浏览

c++ - delete[] 一个对象数组

我已经分配了对象数组

我应该如何删除这个数组?只是

或者迭代数组的元素?

谢谢

更新:

我将循环体更改为

强制代码编译。

0 投票
2 回答
704 浏览

c++ - 删除 char 数组时未定义的行为导致 void *

以下是否会产生未定义的行为:

我首先需要投到somethingchar *

0 投票
6 回答
10259 浏览

c++ - 为什么,真的,删除不完整的类型是未定义的行为?

考虑这个用于解释前向声明不能做什么的经典示例:

我从标准中了解到,由于 Body 的析构函数并非微不足道,因此该案例将走向 UB。我试图理解的是真正的根本原因。

我的意思是,这个问题似乎是由 Handle 的 dtor 是内联的事实“触发”的,因此编译器会执行类似于以下“内联扩展”的操作(这里几乎是伪代码)。

在所有翻译单元(仅Handle_user.cpp在这种情况下)中,Handle 实例都会被销毁,对吧?我只是无法理解:好的,当生成上述内联扩展时,编译器没有 Body 类的完整定义,但是为什么它不能简单地让链接器解析该impl_->~Body()事物,所以让它调用 Body 的析构函数实际在其实现文件中定义的函数?

换句话说:我知道在 Handle 销毁时,编译器甚至不知道 Body 是否存在(非平凡的)析构函数,但是为什么它不能像往常一样做,那就是留下一个“占位符”供链接器填写,如果该功能真的不可用,最终有一个链接器“未解析的外部”?

我在这里错过了什么大事吗(在那种情况下,对不起这个愚蠢的问题)?如果不是这样,我只是想了解这背后的基本原理。

0 投票
5 回答
295 浏览

c++ - 我是否正确删除了这个?

我有一些结构:

我知道这远非理想,远未完成。但是我想知道我是否以正确的方式删除了我的记忆(请不要告诉我如何正确地做到这一点。我正在尝试自己弄清楚)。

这是指向不同问题的链接,这对我来说非常重要。

0 投票
2 回答
275 浏览

c++ - 通过指针删除非拥有的动态数组

我在 C++ 方面相对新手,因为我在本科课程的大部分时间里都对 Java 感到厌烦(很遗憾)。内存管理一直很麻烦,但我已经购买了有关 ansi C 和 C++ 的数字书籍。我已经浏览了相关问题,但找不到符合此特定标准的问题。也许它是如此明显没有人提到它?

这个问题一直困扰着我,但我觉得好像有一个我没有利用的概念点。

认为:

在哪里,

关键在于让“原始”成为一个填充字符的缓冲区,并定期将其副本剃掉并在其他地方使用。

澄清一下,原始内容是通过std::gets(char* buff)std::getline(char* buff, buff_sz)std::read(char* buff, buff_sz)或任何就地填充输入阅读器填充的。为了“刮”一个字符串,它基本上被截断以消除未使用的数组空间。

该错误是堆分配错误,并且delete[].

为了防止泄漏,我想释放 'shaved' 持有的内存,以便在它通过一些参数后再次使用。这可能有一个很好的理由来限制它,但是应该有一些方法来释放内存,因为通过这种配置,没有办法访问数据的原始所有者(指针)。

0 投票
4 回答
526 浏览

c++ - 为什么我可以“删除 p;”,但不能“删除 (p+1);”?为什么删除需要左值?

这个页面上,写着

一个原因是 delete 的操作数不必是左值。考虑:

在这里,delete 的实现没有可以分配零的指针。

向指针添加一个数字会将其在内存中向前移动这些数量的sizeof(*p)单位。

那么, 和 之间有什么区别delete pdelete p+1为什么0只使指针成为问题delete p+1

0 投票
3 回答
1480 浏览

c++ - C ++删除不起作用?

我遇到了删除和析构函数的问题(我确定我在这里犯了一个愚蠢的错误,但到目前为止还没有弄清楚)。

当我进入析构函数并尝试在指针上调用 delete 时,消息显示“Cannot access memory at address some address ”。

相关代码为: