C++ 动态分配的字符数组显示为未使用构造函数初始化
编译此代码时,我收到以下警告: 条件跳转或移动取决于未初始化的值 我的set函数使用的是动态数组,如果动态空间已经存在,我希望让它删除它 班级:C++ 动态分配的字符数组显示为未使用构造函数初始化,c++,C++,编译此代码时,我收到以下警告: 条件跳转或移动取决于未初始化的值 我的set函数使用的是动态数组,如果动态空间已经存在,我希望让它删除它 班级: class Name { char* m_name; public: Name(); Name(const char*); ~Name(); void set(const char*); } 构造函数和setEmpty() 职能: void Name::set(const char* name) {
class Name
{
char* m_name;
public:
Name();
Name(const char*);
~Name();
void set(const char*);
}
构造函数和setEmpty()
职能:
void Name::set(const char* name)
{
if (name == nullptr || std::strlen(name) == 0)
{
setEmpty(); // <-- What my constructor has; sets 'm_name' to nullptr;
}
else
{
int length = std::strlen(name) + 1;
if (m_name != nullptr) // <-- gives warning because m_name is not initialized however it was created via constructor (?)
{
delete[] m_name;
}
m_name = new char[length]; // <-- No matter what I want to re-create the dynamic array
std::strcpy(m_name, name);
}
}
这并不十分清楚,但如果您的类有任何构造函数不调用setEmpty(),那么其中一个可能没有初始化m_name。如果发生这种情况,后续调用set()时,如果strlen()返回一个非零值的非空指针,则会在未初始化时测试m_name的值。您还没有说明如何定义接受const char*的构造函数,因此可能是构造函数造成的彼得5分钟前
这实际上就是问题所在
解决方案:
Name::Name(const char* name)
{
setEmpty(); // <-- call safe state in all constructors
set(name, dob, power, level, super);
}
Name::Name(const char*Name)
{
setEmpty()/c标签在这里是不合适的。这是C++。C没有类。目前还不清楚问题是什么。请阅读并提供一个.@弗兰Sou-OISANDURIX。是的。我只是为了简化代码而做的。我可以添加类名。这个误解有时会发生,事实是:你不会使代码变得更可读或更简单。通过人为引入错误或省略部分内容来理解。请阅读有关@idclev463035818的修订内容。谢谢!
void Name::set(const char* name)
{
if (name == nullptr || std::strlen(name) == 0)
{
setEmpty(); // <-- What my constructor has; sets 'm_name' to nullptr;
}
else
{
int length = std::strlen(name) + 1;
if (m_name != nullptr) // <-- gives warning because m_name is not initialized however it was created via constructor (?)
{
delete[] m_name;
}
m_name = new char[length]; // <-- No matter what I want to re-create the dynamic array
std::strcpy(m_name, name);
}
}
int main()
{
// constructors
Name s1("Sample");
Name s2, s3;
Name badData[] = {
Name ("Kappa"),
Name("Omega"),
Name(nullptr),
Name("", )
};
s1.set("Sample");
//...//
}
Name::Name(const char* name)
{
setEmpty(); // <-- call safe state in all constructors
set(name, dob, power, level, super);
}