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真棒,非常感谢!自检是不必要的,您不可能以自身为参数调用复制构造函数(除非您已经导致未定义的行为)。自检是不必要的,您不可能以自身为参数调用复制构造函数(除非您已经导致未定义的行为)