C++ 动态分配内存和取消引用

C++ 动态分配内存和取消引用,c++,C++,我声明了一个指向名为height的int的指针 我已经使用newint将这个指针的内存分配给int 然后,我将height设置为传递给构造函数的整数 但是,当我调用函数infoheight()时,根据传入的整数,我没有得到185的高度 有人知道为什么吗 class Person{ public: Person(int a, string myname); int* height; string name;

我声明了一个指向名为height的int的指针

我已经使用newint将这个指针的内存分配给int

然后,我将height设置为传递给构造函数的整数

但是,当我调用函数infoheight()时,根据传入的整数,我没有得到185的高度

有人知道为什么吗

 class Person{
        public:
            Person(int a, string myname);
            int* height;
            string name;
            void infoheight();
            void infoname();

    };

    Person::Person(int a, string myname){
        height = new int;
        height = &a;
        name = myname;
    }

    void Person::infoheight(){
        cout << "Height: " << *(height) << endl;
    }

    void Person::infoname(){
        cout << "Name: " << this->name << endl;
    }


    int main(int argc, const char * argv[]) {

        Person Michael(185, "Michael");
        Michael.infoname();
        Michael.infoheight();


        return 0;

    }
班级人员{
公众:
Person(int a,字符串myname);
整数*高度;
字符串名;
空隙高度();
void infoname();
};
Person::Person(int a,字符串myname){
高度=新整数;
高度=&a;
name=myname;
}
void Person::infoheight(){

cout
newint
返回指针

然后立即将该指针替换为
&a
。不要这样做

您可能想做
*height=a

<>虽然这种指针和动态分配的混乱对于实验和学习来说是很好的,但在现实生活中,你永远不会这样做。C++不是java,你不需要在所有事物上调用新的。 您可能希望以“现代C++风格”完成此操作

  • 使用智能指针,永远不要使用
    new
    或delete。
    请注意,只需在类中使用该唯一的_ptr,就可以避免复制问题(它会禁用复制),并在销毁
    Person
    时正确销毁它,而无需编写已删除的复制构造函数或显式析构函数
  • 使用构造函数初始化而不是构造函数函数块来设置类成员值。
    这只是一个好的实践,因为在高级C++中,初始化继承的类、引用和const值是必需的。
  • 不要用大写字母作为变量名。除非它们是全局的。一般来说,你不应该有全局变量
  • 不要构建只设置或返回类成员的成员函数。
    对一个对象的操作应该有意义。对于这个人,而不是
    set\u name
    ,它可能有
    rename
    。而不是
    set\u height
    ,它可能有
    grow

    在你的情况下,而不是<代码>信息名<代码> >类似代码>输出< <代码>或<代码>转储 >或C++一般理解这两条线<代码>操作符> p>:

    height = new int;
    height = &a;
    
    首先手动分配一个新的
    int
    ,然后将新分配的
    int
    的地址分配给
    height
    ,然后通过将
    a
    的地址分配给
    height
    来覆盖该地址。这是一种特定的内存泄漏,因为您不再能够访问将要访问的对象以后需要
    删除
    。如果打算将
    a
    的值写入
    height
    指向的
    int
    ,则需要像这样取消引用
    height

    height = new int;
    *height = a;
    
    或者,相当于:

    height = new int(a);
    
    但是,除非您真的需要指针语义,否则只需按值而不是按指针存储
    高度即可。这将使您的代码更简单,更不容易出错

    class Person{
        public:
            Person(int a, string myname);
            int height; // make this an int, not int*
            string name;
            ...
    };
    
    Person::Person(int a, string myname)
        : height(a), name(myname) { // this is a member initialization list
    
    }
    

    只需做height=a;(使height成为一个常规整数)为什么要为一个简单的原始整数尝试内存分配的东西?只需尝试学习好的方法:学习使用智能指针。height=new int(a)是什么do?这给了我正确的答案它分配了一个新的整数,将其初始值设置为
    a
    ,并将
    高度设置为指向它。
    
    class Person{
        public:
            Person(int a, string myname);
            int height; // make this an int, not int*
            string name;
            ...
    };
    
    Person::Person(int a, string myname)
        : height(a), name(myname) { // this is a member initialization list
    
    }