我已经声明了一个指向高度为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;
}
答案 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
或完全删除。Person
时将其正确销毁,而无需编写删除的复制构造函数或显式的析构函数。set_name
,可能会有rename
。代替set_height
可以有grow
。infoname
或output
之类的东西,而不是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;
}