当我做新的T[1]时会发生什么?
What's happening when I do new T[1]?
本文关键字:什么 更新时间:2023-10-16
快速提问:
template <class T>
T* allocate(std::size_t n){
return new T[n];
}
所以在上面的代码中,当n==1
时,我们在做new T[1]
,所以我有两个问题:
1。我听说在分配数组时,额外的内存用于存储数组的长度(不确定),所以当有new T[1]
很多时,这会是恶意的,浪费了很多内存?
2。我应该使用delete[]
还是简单地使用delete
来释放它?
-
是的,在使用
new T[n]
的典型实现中,需要一些额外的内存来存储数组的确切长度,但是仅用于具有重要析构函数的类型。。在一个典型的实现中,
new int[1]
与new int
相比没有内存开销,但new std::string[1]
与new std::string
相比会有内存开销。额外的内存只是一个额外的
size_t
字段,这意味着它的百分比取决于您分配的对象的大小。如果sizeof(T)
与sizeof(size_t)
相当,则开销可能相当大。但是,这一切也可能取决于特定于实现的内存分配机制的其他细节。
换句话说,如果这是特定于应用程序的代码的一部分,那么尝试它并看看它是否对程序的内存消耗有任何负面影响是有意义的。也许这根本不是问题。但是如果你正在编写一个泛型库,那么这样的事情就值得注意了。
-
是的,你应该使用
delete []
-
RAM很便宜。这是真的,如果你的程序所做的,一直都是,一次又一次地分配一个对象的数组,那么这将会有点浪费,真的。但是偶尔分配一个只有一个元素的数组并不是世界末日。
-
使用
delete[]
。如果您使用new[]
,那么您必须使用delete[]
。不管new
是多少,这是一个反复尝试的规则。没有例外。
- 不使用内存来存储数组的长度,或者至少不允许访问内存。授予你内存的内存管理器可能有一些隐藏的记录。如果你发现了这个簿记,不要管它。你用它做的任何事情都是不可携带的。也有可能为您提供固定大小块的内存。你将得到一个至少是
T
大小的块。这个块中的任何额外内存都被有效地浪费了。 - 使用
new[]
分配的任何内容必须在delete[]
中释放,否则您将调用未定义行为。再强调一次,不要乱用低级内存管理器。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 我应该使用什么来代替void作为变体中的替代类型之一
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用