Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用初始值设定项列表初始化类成员会导致内存泄漏_C++ - Fatal编程技术网

C++ 使用初始值设定项列表初始化类成员会导致内存泄漏

C++ 使用初始值设定项列表初始化类成员会导致内存泄漏,c++,C++,我有一个类,它包含一个属性char*变量名,该变量名指向从包含C样式文本字符串的new char[]中分配的char数组。我使用的重载构造函数具有属性char[]variable name_val且等于“emtpy”。在成员初始化列表中,我已将私有类成员名称初始化为null ptr,并且在构造函数内部,我已根据name_val的大小为其分配空间,并使用strcpy将其复制到name。当我编译程序时,我得到警告说, [警告]不推荐将字符串常量转换为“char*”[-Wwrite strings]。

我有一个类,它包含一个属性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的目的是什么

#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';
,克罗姆只知道什么样的坏蓝精灵会在试图写的时候倒下。你怎么知道你有内存泄漏?当我编译时,有时返回零值,有时崩溃,可能是我写代码时的打字错误,无论如何,谢谢你,当我编译时终于明白了