包含std :: string的memset结构

时间:2011-07-29 18:14:32

标签: c++

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

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

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

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

3 个答案:

答案 0 :(得分:24)

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

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

答案 1 :(得分:4)

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

class Foo
{
  int a;
  double b;
  std::string s;
};

构造函数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);

当然,在构造函数中将所有成员初始化为零会更简洁,但也许你有自己的理由不想创建自定义构造函数。

答案 2 :(得分:-2)

将std :: string成员归零是一个非常糟糕的主意,它将导致内存泄漏!永远不要这样做!