相关疑难解决方法(0)

什么是C++构造"放置新"的用途?

我刚刚学习了名为"placement new"的C++结构.它允许您精确控制指针指向内存的位置.它看起来像这样:

 #include <new>        // Must #include this to use "placement new"
 #include "Fred.h"     // Declaration of class Fred

 void someCode()
 {
   char memory[sizeof(Fred)];
   void* place = memory;

   Fred* f = new(place) Fred();   // Create a pointer to a Fred(),
                                  // stored at "place"

   // The pointers f and place will be equal

   ...
 } 
Run Code Online (Sandbox Code Playgroud)

(来自C++ FAQ Lite的

例子)在这个例子中,thisFred 的指针将等于place.


我已经看到它在我们团队的代码中使用过一次或两次.根据您的经验,这个构造能够实现什么?其他指针语言是否有类似的结构?对我来说,它似乎让人联想equivalence到FORTRAN,它允许不同的变量占据内存中的相同位置.

c++ memory placement-new equivalence new-operator

13
推荐指数
6
解决办法
5064
查看次数

从字节初始化 trivially_copyable 但不是 default_constructible 对象的数组。[intro.object] 中的混乱

我们正在trivially_copiable从辅助存储中初始化(大型)对象数组,诸如此类的问题使我们对所实现的方法缺乏信心。

下面是一个最小的示例,试图说明代码中“令人担忧”的部分。也请在 Godbolt 上找到它

例子

让我们有一个trivially_copyable但不是default_constructible用户类型:

struct Foo
{
    Foo(double a, double b) :
        alpha{a}, 
        beta{b}
    {}

    double alpha;
    double beta;
};
Run Code Online (Sandbox Code Playgroud)

信任cppreference

不存在潜在重叠子对象的普通可复制类型的对象是唯一可以使用 std::memcpy 安全复制或使用 std::ofstream::write()/std::ifstream 与二进制文件序列化的 C++ 对象::读()。

现在,我们想要将二进制文件读入动态数组中Foo。由于Foo不可默认构造,我们不能简单地:

std::unique_ptr<Foo[]> invalid{new Foo[dynamicSize]}; // Error, no default ctor
Run Code Online (Sandbox Code Playgroud)

替代方案(A)

使用未初始化的unsigned char数组作为存储。

std::unique_ptr<unsigned char[]> storage{
    new unsigned char[dynamicSize * sizeof(Foo)] };

input.read(reinterpret_cast<char *>(storage.get()), dynamicSize * sizeof(Foo));

std::cout << reinterpret_cast<Foo *>(storage.get())[index].alpha …
Run Code Online (Sandbox Code Playgroud)

c++ strict-aliasing undefined-behavior language-lawyer

2
推荐指数
1
解决办法
258
查看次数