【问题标题】:C++ segmentation fault caused by malloc operation when dealing with vector处理vector时malloc操作引起的C++分段错误
【发布时间】:2014-08-12 10:05:04
【问题描述】:

有线分段错误让我困惑了一段时间,我定义了一个结构如下:

struct Foo
{
    Foo()
    {
        pc = (char *)malloc(10 * sizeof(char));
        memset(pc, 0, 10 * sizeof(char));
    }
    ~Foo()
    {
        free(pc);
    }
    Foo(const Foo& f)
    {
        if(this == &f) return;
        strncpy(pc, f.pc, 10);
    }
    Foo& operator=(const Foo& f)
    {
        if(this == &f) return *this;
        strncpy(pc, f.pc, 10);
        return *this;
    }
    char * pc;
};

然后我将实例放入向量中:

vector<Foo> vf;
Foo f;
strcpy(f.pc, "hello");
vf.push_back(f);

但是运行到 push_back() 行时发生分段错误,我就是想不通。

【问题讨论】:

  • 在复制构造函数中使用pc uninitialized
  • mallocmemsetstrncpy为什么?!?
  • @Matt McNabb 太棒了,非常感谢!

标签: c++


【解决方案1】:

您的复制构造函数错误。

Foo(const Foo& f)
{
    // if(this == &f) return; Not needed, see comment below; thanks to Matt McNabb
    pc = (char *)malloc(10 * sizeof(char)); // this was missing
    strncpy(pc, f.pc, 10);
}

缺少的行导致 pc 未分配,因此复制将失败。

【讨论】:

  • 自检是不必要的,无论如何都不可能以自己为参数调用复制构造函数(除非你已经引起了未定义的行为)
【解决方案2】:

您的默认构造函数分配内存,但您的复制构造函数没有。

push_back() 在向量内创建对象的副本,调用复制构造函数。它使用strncpy() 将你的“你好”...复制到某个地方。

【讨论】:

    【解决方案3】:

    您的复制构造函数没有为pc 分配内存,因此您将内存复制到一个未初始化的变量。如果调用了复制构造函数,则不调用默认构造函数

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 2017-11-19
      • 2011-02-13
      • 1970-01-01
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多