C++在不激活构造函数的情况下分配内存

sch*_*ein 5 c++ memory-management

我正在读取一个文件中的值,我会在读取它时将其存储在内存中.我在这里读到,在C++中处理内存位置的正确方法是始终使用new/delete,但如果我这样做:

DataType* foo = new DataType[sizeof(DataType) * numDataTypes];
Run Code Online (Sandbox Code Playgroud)

然后,这将为每个创建的实例调用默认构造函数,我不希望这样.我打算这样做:

DataType* foo;
char* tempBuffer=new char[sizeof(DataType) * numDataTypes];
foo=(DataType*) tempBuffer;
Run Code Online (Sandbox Code Playgroud)

但我认为这会是某种类型 - 不安全的poo-poo.所以我该怎么做?

在研究这个问题时,我已经看到有些人说阵列很糟糕,矢量很好.我试图更多地使用数组因为我认为我是一个坏男孩通过填充我的程序(我认为是)较慢的向量.我该怎么用???

vil*_*pam 7

使用矢量!!! 由于您知道元素的数量,因此请确保首先保留内存(通过在插入元素之前调用myVector.reserve(numObjects)).

通过这样做,您将不会调用类的默认构造函数.

所以使用

std::vector<DataType> myVector; // does not reserve anything
...
myVector.reserve(numObjects); // tells vector to reserve memory
Run Code Online (Sandbox Code Playgroud)


Log*_*ldo 5

您可以::operator new用来分配任意大小的内存。

DataType* foo = static_cast<DataType*>(::operator new(sizeof(DataType) * numDataTypes));
Run Code Online (Sandbox Code Playgroud)

::operator newmalloc这里使用over 的主要优点是,它会引发故障并与任何new_handlers等集成。您需要使用以下命令清理内存::operator delete

::operator delete(foo);
Run Code Online (Sandbox Code Playgroud)

new Something当然,常规将调用构造函数,这就是重点new

避免额外的构造(例如默认构造函数)或出于性能原因推迟它们是一回事,而完全跳过任何构造函数是另一回事。我给你的印象是

DataType dt;
read(fd, &dt, sizeof(dt));
Run Code Online (Sandbox Code Playgroud)

如果这样做的话,无论如何您已经将类型安全性扔到了窗外。

您为什么要尝试通过不调用构造函数来实现?