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