我需要创建2个类,第二个类必须有指向第一个对象的指针作为其成员。我的程序工作,但有内存泄漏,我无法解决它们。我知道,问题出在构造函数或析构函数中,但我不知道如何解决它。这是我的代码:
的main.cpp
#include "classes.h"
int main() {
COne firstObj;
CTwo secondObj;
firstObj.setN(10);
firstObj.setS("candies");
firstObj.print();
secondObj.setS("cookies");
secondObj.setP(&firstObj);
cout<<endl;
secondObj.print();
return 0;
}
classes.h
#ifndef CLASSES_H
#define CLASSES_H
#include <iostream>
#include <string>
using namespace std;
class COne {
private:
int n;
string sOne;
public:
COne(int n2create = 0, const string& sOne2create = "");
COne(const COne& obj);
~COne();
COne& operator=(const COne& obj);
void setN(int n2set);
void setS(const string &sOne2set);
int getN() const;
string getS() const;
void print() const;
};
class CTwo {
private:
string sTwo;
COne* p;
public:
CTwo(string sTwo2create = "", COne& p2create = *(new COne()));
CTwo(const CTwo& obj);
~CTwo();
CTwo& operator=(const CTwo& obj);
void setS(string sTwo2set);
void setP(COne* p2set);
string getS() const;
COne* getP() const;
void print() const;
};
#endif
classes.cpp
#include "classes.h"
COne::COne(int n2create, const string& sOne2create) :n(n2create), sOne(sOne2create) {}
COne::COne(const COne& obj) :n(obj.n), sOne(obj.sOne) {}
COne::~COne() {}
COne& COne::operator=(const COne& obj){
n = obj.n;
sOne = obj.sOne;
return *this;
}
void COne::setN(int n2set) {n = n2set;}
void COne::setS(const string& sOne2set) {sOne = sOne2set;}
int COne::getN() const {return n;}
string COne::getS() const {return sOne;}
void COne::print() const {
cout<<"COne object:"<<endl;
cout<<"n = "<<n<<endl;
cout<<"sOne = \""<<sOne<<"\""<<endl;
}
CTwo::CTwo(string sTwo2create, COne& p2create) :sTwo(sTwo2create), p(new COne(p2create)) {}
CTwo::CTwo(const CTwo& obj) :sTwo(obj.sTwo), p(new COne (*obj.p)){}
CTwo::~CTwo() {delete p;}
CTwo& CTwo::operator=(const CTwo& obj){
sTwo = obj.sTwo;
p = obj.p;
return *this;
}
void CTwo::setS(string sTwo2set) {sTwo = sTwo2set;}
void CTwo::setP(COne* p2set) {p = p2set;}
string CTwo::getS() const {return sTwo;}
COne* CTwo::getP() const {return p;}
void CTwo::print() const {
cout<<"CTwo object:"<<endl;
cout<<"sTwo = \""<<sTwo<<"\""<<endl;
cout<<"p: n = "<<p->getN()<<", sOne = \""<<p->getS()<<"\""<<endl;
}
答案 0 :(得分:1)
一,在:
COne& p2create = *(new COne())
如果参数是默认构造的,则会发生内存泄漏。这是因为p2create
是对动态分配的对象的引用,然后将其复制到另一个动态分配的对象中,仅存储后者,永远不会释放前者。
具体在:
CTwo::CTwo(string sTwo2create, COne& p2create) :sTwo(sTwo2create), p(new COne(p2create)) {}
您的代码当然包含其他错误。要解决所有问题,只需将您的类重写为:
struct COne {
int n;
std::string s;
void print() const {
std::cout << "COne object:\n"
<< "n = " << n << '\n'
<< "s = \"" << s << "\"\n";
}
};
struct CTwo {
std::string sTwo;
COne p;
void print() const {
std::cout << "CTwo object:\n"
<< "sTwo = \"" << sTwo << "\"\n"
<< "p: n = "<< p.n << ", s = \"" << p.s <<"\"\n";
}
};
在功能上是等效的,然后将它们用作:
int main() {
COne firstObj {10, "candies"};
firstObj.print();
std::cout << '\n';
CTwo secondObj {"cookies", firstObj};
secondObj.print();
return 0;
}
答案 1 :(得分:0)
void CTwo::setP(COne* p2set) {p = p2set;}
保存新指针,覆盖先前的p值,而不删除分配给p。
的任何先前分配的内存