C++ 使用初始值设定项列表初始化类成员会导致内存泄漏
我有一个类,它包含一个属性char*变量名,该变量名指向从包含C样式文本字符串的new char[]中分配的char数组。我使用的重载构造函数具有属性char[]variable name_val且等于“emtpy”。在成员初始化列表中,我已将私有类成员名称初始化为null ptr,并且在构造函数内部,我已根据name_val的大小为其分配空间,并使用strcpy将其复制到name。当我编译程序时,我得到警告说, [警告]不推荐将字符串常量转换为“char*”[-Wwrite strings]。我还发现内存泄漏。因此,我花了很少的时间来胡闹,当我将char name_val设置为const char name_val[]=“empty”时,在重载构造函数中,一切都很好 下面是代码,请注意,在重载构造函数中,属性char[]variable name_uval未设置为const 有人能解释一下,在这种情况下,const的目的是什么C++ 使用初始值设定项列表初始化类成员会导致内存泄漏,c++,C++,我有一个类,它包含一个属性char*变量名,该变量名指向从包含C样式文本字符串的new char[]中分配的char数组。我使用的重载构造函数具有属性char[]variable name_val且等于“emtpy”。在成员初始化列表中,我已将私有类成员名称初始化为null ptr,并且在构造函数内部,我已根据name_val的大小为其分配空间,并使用strcpy将其复制到name。当我编译程序时,我得到警告说, [警告]不推荐将字符串常量转换为“char*”[-Wwrite strings]。
#include<iostream>
#include<cstring>
using namespace std;
class Person{
char *name;
public:
Person(char name_val[]="empty"):
name{nullptr}{
name=new char[strlen(name_val)+1];
strcpy(name,name_val);
}
~Person(){
delete [] name;name=nullptr;
}
char *get_Name()const{return name;}
};
int main(){
Person p;
cout<<p.get_Name()<<endl;
return 0;
}
#包括
#包括
使用名称空间std;
班主任{
字符*名称;
公众:
人员(字符名称\u val[]=“空”):
名称{nullptr}{
name=新字符[strlen(name_val)+1];
strcpy(名称、名称和价值);
}
~Person(){
删除[]名称;名称=nullptr;
}
char*get_Name()常量{return Name;}
};
int main(){
人p;
当你写的时候:
Person(char name_val[]="empty")
Person()
{
char name_val[]="empty"
...
}
这相当于写:
Person(char *name_val="empty")
现在您可以看到,您正在将一个字符串常量分配给非常量char*
,因此出现了警告。解决方案(显然)是:
Person(const char *name_val="empty")
然后编译器就会高兴了
奥托,当你写:
Person(char name_val[]="empty")
Person()
{
char name_val[]="empty"
...
}
然后在堆栈上创建一个字符数组,并将给定的字符串常量复制到其中,因此不需要const
(尽管在本例中这仍然是一个好主意)
我不知道你为什么认为你有内存泄漏。我在你的代码中没有看到内存泄漏。当你写:
Person(char name_val[]="empty")
Person()
{
char name_val[]="empty"
...
}
这相当于写:
Person(char *name_val="empty")
现在您可以看到,您正在将一个字符串常量分配给非常量char*
,因此出现了警告。解决方案(显然)是:
Person(const char *name_val="empty")
然后编译器就会高兴了
奥托,当你写:
Person(char name_val[]="empty")
Person()
{
char name_val[]="empty"
...
}
然后在堆栈上创建一个字符数组,并将给定的字符串常量复制到其中,因此不需要const
(尽管在本例中这仍然是一个好主意)
我不知道你为什么认为你有内存泄漏。我在你的代码中没有看到
使用初始值设定项列表初始化类成员会导致内存泄漏
我还看到内存泄漏
显示的程序中没有内存泄漏。不清楚为什么您会认为您看到了它
有人能解释一下,在这种情况下,const的目的是什么
#include<iostream>
#include<cstring>
using namespace std;
class Person{
char *name;
public:
Person(char name_val[]="empty"):
name{nullptr}{
name=new char[strlen(name_val)+1];
strcpy(name,name_val);
}
~Person(){
delete [] name;name=nullptr;
}
char *get_Name()const{return name;}
};
int main(){
Person p;
cout<<p.get_Name()<<endl;
return 0;
}
对象为常量意味着其状态(类类型中的可变成员除外)无法修改。指向常量的指针/引用意味着指向/引用的对象不能通过指针/引用进行修改
指向非常量的指针可以隐式转换为指向常量的指针,但返回的转换不是隐式的
字符串文字是const。指向C++的C++对象C++中的一个指向非const(char */COD>)的指针不能被分配给const对象。你看到的警告消息意味着你使用C++的C++ 11版本。然后,字符串字符串转换为<代码> char */COD>格式很好,但是转换被删除了。
p.S.Person
有一个严重的设计缺陷:该类是可复制的,但如果您有意或无意复制,程序的行为将是未定义的
p.p.S.默认成员初始化器是多余的,因为您从未使用过它
使用初始值设定项列表初始化类成员会导致内存泄漏
我还看到内存泄漏
显示的程序中没有内存泄漏。不清楚为什么您会认为您看到了它
有人能解释一下,在这种情况下,const的目的是什么
#include<iostream>
#include<cstring>
using namespace std;
class Person{
char *name;
public:
Person(char name_val[]="empty"):
name{nullptr}{
name=new char[strlen(name_val)+1];
strcpy(name,name_val);
}
~Person(){
delete [] name;name=nullptr;
}
char *get_Name()const{return name;}
};
int main(){
Person p;
cout<<p.get_Name()<<endl;
return 0;
}
对象为常量意味着其状态(类类型中的可变成员除外)无法修改。指向常量的指针/引用意味着指向/引用的对象不能通过指针/引用进行修改
指向非常量的指针可以隐式转换为指向常量的指针,但返回的转换不是隐式的
字符串文字是const。指向C++的C++对象C++中的一个指向非const(char */COD>)的指针不能被分配给const对象。你看到的警告消息意味着你使用C++的C++ 11版本。然后,字符串字符串转换为<代码> char */COD>格式很好,但是转换被删除了。
p.S.Person
有一个严重的设计缺陷:该类是可复制的,但如果您有意或无意复制,程序的行为将是未定义的
p.p.S.默认成员初始值设定项是多余的,因为您从未使用过它。字符串文字,如“empty”
,可以存储在只读内存中。如果您用非常量指针指向它,您将为类似name\u val[0]的胡言乱语打开大门='X';
,克罗姆只知道什么样的坏蓝精灵会在试图写的时候倒下。你怎么知道你有内存泄漏?像“empty”
这样的字符串文字可以存储在只读内存中。如果你用非常量指针指向它,你就会为name\u val[0]这样的胡说八道打开大门='X';
,克罗姆只知道什么样的坏蓝精灵会在试图写的时候倒下。你怎么知道你有内存泄漏?当我编译时,有时返回零值,有时崩溃,可能是我写代码时的打字错误,无论如何,谢谢你,当我编译时终于明白了