c++ - 如何用两个指针初始化类的对象?
问题描述
好的,所以我知道这是基本的,但我不明白我在这里做错了什么。这是课程:
class numar_complex {
friend std::ostream& operator<<(std::ostream& out, const numar_complex& numar_complex);
friend std::istream& operator>>(std::istream& is, numar_complex& numar_complex);
private:
double* p_real;
double* p_imaginar;
public:
//constructor, destructor:
numar_complex()
{
double* p_real{ new double(0.0) };
double* p_imaginar{ new double(0.0) };
cout << "constructor" << endl;
}
numar_complex(const numar_complex& nr)
{
if (p_real != nullptr) {
p_real = nullptr;
delete p_real;
}
p_real = new double(*nr.p_real);
if (p_imaginar != nullptr) {
p_imaginar = nullptr;
delete p_imaginar;
}
p_imaginar = new double(*nr.p_imaginar);
cout << "copy constructor " << endl;
}
~numar_complex()
{
p_real = nullptr;
delete p_real;
p_imaginar = nullptr;
delete p_imaginar;
cout << "destructor" << endl;
}
// getteri:
double get_p_real()
{
return *p_real;
}
double get_p_imaginar()
{
return *p_imaginar;
}
//setteri:
void set_p_real(double x)
{
p_real = nullptr;
delete p_real;
p_real = new double(x);
}
void set_p_imaginar(double x)
{
p_imaginar = nullptr;
delete p_imaginar;
p_imaginar = new double(x);
}
std::ostream& operator<<(std::ostream& out, const numar_complex& numar_complex)
{
if (*numar_complex.p_imaginar >= 0) {
out << *numar_complex.p_real << "+" << *numar_complex.p_imaginar << "*i \n";
}
else if (*numar_complex.p_imaginar < 0) {
out << *numar_complex.p_real << *numar_complex.p_imaginar << "*i \n";
}
return out;
}
并且由于某种原因,当我简单地声明这个类的一个对象时,
numar complex x;
cout << x;
它崩溃(内存问题);但是,如果我使用 setter/getter,问题就不会再出现了。如果是
numar complex x;
x.set_p_real(1);
x.set_p_imaginar(1);
cout << x;
将导致 1 + 1i;
PS:如果我不使用 setter 来初始化值,getter 也会导致崩溃。
解决方案
在你不初始化的构造函数p_real
中p_imaginar
,你声明了新的变量,这些变量只存在于构造函数的范围内,因此被破坏,导致内存泄漏。
为避免这种情况,我建议使用成员初始化器列表
class complex
{
private:
double* p_real;
double* p_imaginar;
public:
numar_complex():
p_real(new double(0.0)),
p_imaginar(new double(0.0))
{
cout << "constructor" << endl;
}
.
.
.
.
//the rest
}
推荐阅读
- regex - Convert Regex to be safari compliant
- python - ImportError When Importing Tensorflow Pywrap_tfe
- apache-kafka - Partition replication in case of messages directly posted to a partition in Kafka
- python - 我可以使用 webhook 创建执行某些操作的日志吗?
- c# - InvalidOperationException:使用 cermgr 安装的证书在 AspNetCore 上未指定密钥类型
- vue.js - How to render a modal that is inside a component from another component in vueJs and Bootstrap
- android - 如何在 Android Jetpack Compose 中创建任意方向的拖动手势
- jax-rs - 在 quarkus 中检索客户端 IP 地址
- jenkins - Avoid report to verified/code-review flag for a specific Jenkins Job
- python - 在指数中插入缺失的季度收益日期