C++ 我用valgrind编译我的程序,得到一个条件跳转
我有一个复制赋值操作符,在这个函数的两行上有一个条件跳转,在析构函数中有一行。我不确定错误在哪里,它在VisualStudio上运行良好,但在valgrind上编译时,问题就出现了C++ 我用valgrind编译我的程序,得到一个条件跳转,c++,valgrind,C++,Valgrind,我有一个复制赋值操作符,在这个函数的两行上有一个条件跳转,在析构函数中有一行。我不确定错误在哪里,它在VisualStudio上运行良好,但在valgrind上编译时,问题就出现了 if(copy.m_desc != nullptr && strlen(copy.m_desc) > 0)//conditional jump if (this != ©) { if (m_desc != nullptr) { /
if(copy.m_desc != nullptr && strlen(copy.m_desc) > 0)//conditional jump
if (this != ©) {
if (m_desc != nullptr) { // conditional jump
delete[] m_desc;
m_desc = nullptr;
}
m_start = copy.m_start;
m_desc = new char[strlen(copy.m_desc) + 1];
strcpy(m_desc, copy.m_desc);
delete[] copy.m_desc;
copy.m_desc = nullptr;
}
return *this;
}
Event::~Event() {
delete[] m_desc; // conditional jump
}
这将产生一个新的结果。为什么在C++中使用C风格字符串?它需要使用C风格的字符串,完全错误消息“条件跳跃或移动取决于未初始化值”。这意味着变量(似乎
m_desc
和copy.m_desc
)没有初始化为任何内容。另外,valgrind不是编译器。如果(copy.m_desc!=nullptr&&strlen(copy.m_desc)>0)//条件跳转
——为什么在赋值运算符中还要进行此测试?当前对象不应该像这样进行这些测试——它应该简单地除去当前内容并制作一个副本(当然,除非对象被分配给它自己)。现在,赋值操作符被这样的测试破坏了。现在,你的程序中可能有一个“拷贝”,而不是真正的拷贝——这导致了C++程序中最难找到的bug。