C++ 我用valgrind编译我的程序,得到一个条件跳转

C++ 我用valgrind编译我的程序,得到一个条件跳转,c++,valgrind,C++,Valgrind,我有一个复制赋值操作符,在这个函数的两行上有一个条件跳转,在析构函数中有一行。我不确定错误在哪里,它在VisualStudio上运行良好,但在valgrind上编译时,问题就出现了 if(copy.m_desc != nullptr && strlen(copy.m_desc) > 0)//conditional jump if (this != &copy) { if (m_desc != nullptr) { /

我有一个复制赋值操作符,在这个函数的两行上有一个条件跳转,在析构函数中有一行。我不确定错误在哪里,它在VisualStudio上运行良好,但在valgrind上编译时,问题就出现了

       if(copy.m_desc != nullptr && strlen(copy.m_desc) > 0)//conditional jump
       if (this != &copy) {
           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。