C++ C++;处理向量时malloc操作导致的分段错误

C++ C++;处理向量时malloc操作导致的分段错误,c++,C++,一个有线分段错误让我困惑了一段时间,我定义了一个结构,如下所示: struct Foo { Foo() { pc = (char *)malloc(10 * sizeof(char)); memset(pc, 0, 10 * sizeof(char)); } ~Foo() { free(pc); } Foo(const Foo& f) { if(this ==

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

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);
向量vf;
福福;
strcpy(f.pc,“你好”);
vf.推回(f);

但是当运行到push_back()行时,出现了分段错误,我就是想不出来。

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


push_back()
在向量中创建对象的副本,调用复制构造函数。使用
strncpy()
复制您的“hello”。。。某个地方。

默认构造函数分配内存,但复制构造函数不分配内存


push_back()
在向量中创建对象的副本,调用复制构造函数。使用
strncpy()
复制您的“hello”。。。某处。

您的复制构造函数是错误的。

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未分配,因此复制将失败。

您的复制构造函数错误。

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未分配,因此复制将失败。

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

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

在复制构造函数中,您使用的
pc
未初始化
malloc
memset
strncpy
…为什么@Matt McNabb真棒,非常感谢!在复制构造函数中,您使用未初始化的
pc
malloc…
memset
strncpy
…为什么@Matt McNabb真棒,非常感谢!自检是不必要的,您不可能以自身为参数调用复制构造函数(除非您已经导致未定义的行为)。自检是不必要的,您不可能以自身为参数调用复制构造函数(除非您已经导致未定义的行为)