自定义运算符new[]请求大于预期的内存
Custom operator new[] requests for larger than expected memory
我无法解释为什么在示例代码中,对自定义operator new[]
的调用new Foo [4]
请求68字节—比它应该(sizeof(Foo) == 16
)多4字节,而更神秘的调用Foo::operator new[]( 4 * sizeof( Foo ) )
正确地请求64字节。注意,当成员std::vector<long> m_dummy
从Foo
中移除时,两个调用都正确地请求16字节(ideone上的代码)。
#include <vector>
#include <iostream>
struct MemoryManager
{
static void* allocate( unsigned size )
{
static char block[256];
return block;
}
};
class Foo
{
public:
void* operator new[]( size_t size )
{
std::cout << "operator new[] : data size -- " << size << std::endl;
return MemoryManager::allocate( size );
}
private:
std::vector<long> m_dummy; // Huh?
unsigned m_num;
};
int main( int argc, char * argv[] )
{
std::cout << "Foo size: " << sizeof( Foo ) << std::endl;
new Foo [4];
Foo::operator new[]( 4 * sizeof( Foo ) );
}
根据标准(5.3.4 New):
在实际操作中,
new T[5]
导致调用operator new[](sizeof(T)*5+x)
这里,
返回的值中偏移这个量。x
…是非负的未指定值,表示数组分配开销;的结果是new-expression将从操作符new[]
. ...每次调用
new
的开销可能会有所不同。
可用于表示已分配元素的数目。正如@vsoftco注释的那样,"这就是操作符delete[]
知道如何执行清理的方式"。
参见18.6.1.2数组形式:
operator new[](std::size_t)
或operator delete[](void*)
不直接负责记录数组的重复计数或元素大小。这些操作在数组new
和delete
表达式的其他地方执行。然而,数组new
表达式可以将size
参数增加到operator new[](std::size_t)
,以获得存储补充信息的空间。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 大于65535的C++数组[size]引发不一致的溢出
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 查找最接近的大于当前数字的数字的索引
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- CUDA 将大于线程计数的数组复制到共享内存
- 调用计数大于为 src 分配的内存的 memcpy 是否安全
- 内存管理不良?类成员(布尔值)值大于 1,在递归函数中
- 自定义运算符new[]请求大于预期的内存
- 内存池:对于大于缓存行大小的结构体,它们会提高缓存使用率吗?
- 写入大于系统内存的内存映射区域
- 允许分配大于32位的堆内存
- 大于1GB内存分配错误