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...

エンジンの名前を格納する文字列変数があることを除けば、モーターボート クラスの場合とほとんど同じです。

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

It's probably a leak within your constructors. My suggestion is to make destructors for each of the classes you define to ensure that you delete any objects created in the constructor.

于 2013-06-13T21:21:33.937 に答える
1

あなたができることは追加することです

#define _CRTDBG_MAP_ALLOC
#include <Crtdbg.h>

メモリ リークの出力を使用すると、残りのブロックが割り当てられたファイルと行が表示されます。

また、printf("Destructor of xxxx\n");各デストラクタ (Boat、Sailboat、Motoroboat) に a などを入れます。これらは、削除時に呼び出し/出力する必要があります。

ただし、ベース コール (Baot) のデストラクタが virtual とマークされている場合にのみ呼び出されます。そうしないと、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 に答える