包含std :: string的memset结构

Joh*_*0te 16 c++

我有一个庞大的结构,其中整个内容是标量变量,枚举和标量数组(基于堆栈),但一个std :: string变量除外.

现在,这是我的问题......

我可以将结构的整体大小设置为0(就像我只是所有标量一样),或者std :: string在那里是不可能的?我不确定memset会对其内部表示做什么.

如果你要说它的好/坏请解释原因 - 我想知道为什么它是这样的:)

Nod*_*ode 25

不,你不能,它会覆盖字符串的内部状态并使坏事发生.您可以将所有POD内容包装在一个单独的结构中并将其放在当前结构中,这样您就可以将其设置为memset并让字符串默认构造.

编辑:只是为了澄清,字符串几乎肯定会存储指向其分配给存储的内存的指针.字符串的构造函数将始终在您进行memset之前运行(即使您this在类型的构造函数中进行memset ,字符串构造函数也会先运行).因此,您将覆盖此指针值,而不是指向其存储,它将指向NULL,或其他一些几乎肯定无效的值.


Ker*_* SB 5

这是一个奇特的想法:假设您的类Foo有许多原始成员,它们在Foo的构造函数中保持未初始化,但一个字符串除外:

class Foo
{
  int a;
  double b;
  std::string s;
};
Run Code Online (Sandbox Code Playgroud)

构造函数Foo::Foo()将正确初始化字符串,但它不会关心其他任何事情。所以,在构建之前让我们将内存清零!

void * addr = ::operator new(sizeof(Foo));
std::memset(addr, 0, sizeof(Foo));
Foo * p = new (addr) Foo;

// later

p->~Foo();
::operator delete(addr);
Run Code Online (Sandbox Code Playgroud)

当然,在构造函数中将所有成员初始化为零会更干净,但也许您有自己的原因不想创建自定义构造函数。