构造函数中的c ++内存泄漏

时间:2015-10-26 00:28:09

标签: c++ memory-leaks

我需要创建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;
}

2 个答案:

答案 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;
}

Live demo

答案 1 :(得分:0)

void CTwo::setP(COne* p2set) {p = p2set;}

保存新指针,覆盖先前的p值,而不删除分配给p。

的任何先前分配的内存