1

所以..我一直在努力释放一个数组。
我不知道为什么会有内存泄漏,但不知何故有一个。
除了主函数之外,我没有在任何地方分配任何内存。

#include <iostream>
#include "Motorboat.h"
#include "Sailboat.h"

using namespace std;
void printSailBoats(Boat* arr[], int nrOfElements);
int main() {
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); // used to check for memoryleaks in debug mode

    Boat* test[4];
    int nrOfElements = 4;

    test[0] = new Motorboat("heeelllooo",15000,"v100");
    test[1] = new Sailboat("saaailboat",1004,43.5);
    test[2] = new Motorboat("ASDK",4932,"Blabla");
    test[3] = new Sailboat("DKEOK",4992,103.4);

    printSailBoats(test,nrOfElements);

    for(int i=0; i<4; i++) {
        delete test[i];
    }

    return 0;
}

void printSailBoats(Boat* arr[], int nrOfElements) {
        // prints all sailboats
}

编辑:添加了课程。 船.h:

#ifndef BOAT_H
#define BOAT_H
#include <string>
using namespace std;

class Boat {
    public:
        virtual void setModel(string newModel) = 0;
        virtual void setPrice(int newPrice) = 0;
        virtual string getModel() const = 0;
        virtual int getPrice() const = 0;
        virtual string getType() const = 0;
        virtual string toString() const = 0;
};
#endif

帆船.h:

#ifndef SAILBOAT_H
#define SAILBOAT_H
#include "Boat.h"

class Sailboat: public Boat {
    private:
        double sailArea;
        string model;
        int price;

    public:
        Sailboat(string model, int price, double sailArea);
        void setSailArea(double newSailArea);
        double getSailArea() const;
        string toString() const;
        void setModel(string newModel);
        void setPrice(int newPrice);
        string getModel() const;
        int getPrice() const;
        string getType() const;
};
#endif

帆船.cpp:

#include "Sailboat.h"

Sailboat::Sailboat(string model, int price, double sailArea) {
    this->model = model;
    this->price = price;
    this->sailArea = sailArea;
}

// Setters, getters and toString...

对于 motorboat 类来说,这几乎是一样的,只是有一个字符串变量来存储引擎的名称而不是saiarea。

4

4 回答 4

2

泄漏在这里:

for(int i=0; i<4; i++) {
        delete test[i];
    }

它正在删除元素,就好像它们与基类具有相同的类型。IE 如果您的派生类中有任何“额外”信息,它将被泄露。

例如:

delete (Sailboat*)test[i]

不同于

delete (Boat*)test[i]

您需要在删除之前将 test[i] 转换为适当的类型。回收你实例化的类型可能很困难,所以我建议你简单地使用智能指针,而不用担心删除。

编辑:此外,虚拟析构函数将解决此问题。我仍然支持智能指针;)

于 2013-06-13T21:28:36.770 回答
1

这可能是您的构造函数中的泄漏。我的建议是为您定义的每个类创建析构函数,以确保删除在构造函数中创建的任何对象。

于 2013-06-13T21:21:33.937 回答
1

你可以做的是添加

#define _CRTDBG_MAP_ALLOC
#include <Crtdbg.h>

使用内存泄漏输出,它应该为您提供分配剩余块的文件和行。

此外,printf("Destructor of xxxx\n");在每个析构函数(船、帆船、摩托艇)中放置一个等。这些应该在删除时调用/打印。

但只有在基本调用 (Baot) 的析构函数被标记为虚拟时,它们才会被调用。否则,您只会调用 Boat-destructors(并且可能会丢失在 Sailboat 和 Motorboat 中分配的内存)

于 2013-06-13T21:24:13.123 回答
1

在看到定义后添加:

class Boat {
    public:
        Boat() 
            { }
        virtual ~Boat()  // <--- this is the real catch!
                  { } 

        ...
};
于 2013-06-13T21:41:45.483 回答