动态分配内存并取消引用

时间:2018-11-21 00:59:03

标签: c++

我已经声明了一个指向高度为int的指针。

我已经通过使用新的int为该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;

    }

2 个答案:

答案 0 :(得分:1)

在这两行中:

height = new int;
height = &a;

您首先要手动分配新的int,然后将新分配的int的地址分配给height,然后然后您将覆盖该地址通过将a的地址分配给height。这是某种内存泄漏,因为您不再有权访问以后需要delete的对象。如果您打算将a写入int指向的height 中,则需要取消引用{{ 1}}就像这样:

height

或者,等效地:

height = new int;
*height = a;

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

height

答案 1 :(得分:0)

new int返回一个指针。

,然后立即用&a替换该指针。不要那样做。

您可能想做*height = a

尽管这种将指针和动态分配弄乱的方式可以很好地进行实验和学习,但您在现实生活中绝不会像那样做。 C ++不是Java,您不需要在所有程序上都调用new。

您可能希望以“现代C ++”样式进行操作。

  • 使用智能指针,永远不要使用new或完全删除。
    请注意,仅在类中使用unique_ptr即可避免复制问题(禁用复制),并在销毁Person时将其正确销毁,而无需编写删除的复制构造函数或显式的析构函数。
  • 使用构造函数初始化而不是构造函数功能块来设置类成员值。
    这只是一个好习惯,因为在高级C ++中,为了初始化继承的类,引用和const值,它是必需的。
  • 请勿将大写字母用作变量名。除非它们是全球性的。通常,您不应该具有全局变量。
  • 不要构建仅设置或返回类成员的成员函数。
    对对象的操作应具有某些含义。使用此人而不是set_name,可能会有rename。代替set_height可以有grow
    在您的情况下,您可以使用infonameoutput之类的东西,而不是dump或一般理解为operator<<的C ++输出流编写器。

#include <iostream>
#include <memory>
#include <string>

class Person {
   public:
    Person(int h, std::string n) : height(std::make_unique<int>(h)), name(n) {}

   private:
    std::unique_ptr<int> height;
    std::string name;

    friend std::ostream& operator<<(std::ostream& os, const Person& p) {
        return os << "{name: " << p.name << ", height: " << *p.height << "}";
    }
};

int main() {
    Person michael(185, "Michael");
    std::cout << michael << std::endl;
    return 0;
}