1

これは私のクラスです:

using namespace std;

Class Book {
    public:
        Book();
        Book(vector<string>*, string, int);
        Book(const Book&);
        ~Book();
        Book& operator=(const Book&);
        void update(vector<string>*);
        void update(string); 
        void update(int); 
        int getYear() const{
            return year;
        };
        string getTitle() const{
            return title;
        };
        bool operator==(const Book&);
        bool operator!=(const Book&);
        friend std::ostream& operator<<(std::ostream&, const Book&);
        void getAuthors();
    private:
        vector<string>* authors;
        string title;
        int year;
};

#endif  /* BOOK_H */

そのソースは次のとおりです。

#include "Book.h"
using namespace std;

Book::Book():year(0), title(NULL), authors(NULL){}
Book::Book(vector<string>* bookauthors,string booktitle, int bookyear ){
    authors = bookauthors;
    title = booktitle;
    year = bookyear;
}

Book::Book(const Book& aBook){
    authors = aBook.authors;
    title = aBook.title;
    year = aBook.year;
}

Book::~Book(){
    delete authors;
    delete &title;
    delete &year;
}

bool Book::operator==(const Book &aBook){
    if(getYear() == aBook.getYear() && getTitle() == aBook.getTitle())
        return true;
    else return false;
}

bool Book::operator != (const Book &aBook){
    if(getYear() != aBook.getYear() && getTitle() != aBook.getTitle())
        return true;
    else return false;
}

Book& Book::operator =(const Book& rhs){
    if(this != &rhs){
        authors = rhs.authors;
        title = rhs.title;
        year = rhs.year;
    }
    return *this;
}

void Book::update(int newyear){
    year = newyear;
}

void Book::update(string newtitle){
    title = newtitle;    
}

void Book::update(vector<string>* newauthors){
    authors = newauthors;
}

std::ostream& operator <<(std::ostream& os, const Book& b){
    os<<b.getTitle()<<", "<<b.getYear();
    return os;
}

実行されるメインファイルは次のとおりです。

    #include "Book.h"
#include <iostream>
#include <limits.h>
//This is the test funcion posted on the class website
using namespace std;

int main(){

  //testing constructor
  vector<string> authors;
  authors.push_back("Ritchie");
  authors.push_back("Kernighan");
  Book a(&authors, "C", 1990);
  authors.push_back("Whatever");
  cout << "Book a is: " << a << endl;
  cout << "Expected: (C, 1990, Ritchie & Kernighan)" << endl;

  //testing copy constructor
  Book b(a);
  a.update(&authors);
  cout << "Book b is: " << b << endl;
  cout << "Expected: (C, 1990, Ritchie & Kernighan)" << endl;

  //testing constructor
  vector<string> authors2;
  authors2.push_back("Crockford");
  Book c(&authors2, "JavaScript", 2008);
  cout << "Book c is: " << c << endl;
  cout << "Expected: (JavaScipt, 2008, Crockford)" << endl;

  //testing assignment operator
  authors2.push_back("whatever");
  a=c;
  cout << "Book a is changed to: " << a << endl;
  cout << "Expected: (JavaScipt, 2008, Crockford)" << endl;

  for(int i=0; i < 200000000; i++)
    b=c;
  cout << "Book b is changed to: " << b << endl;
  cout << "Expected: (JavaScipt, 2008, Crockford)" << endl;
}

私はそれを実行するときにこれを取得し続けます:

bookclass(58316)malloc:*オブジェクト0x7fff522d78b0のエラー:解放されるポインターが割り当てられませんでした*デバッグするためにmalloc_error_breakにブレークポイントを設定します

私はC++を初めて使用するため、メモリの割り当て方法がわかりません。使っmallocてみましたがうまくいきませんでした。

4

2 に答える 2

6

メンバーはオブジェクト内に配置されます。つまり、メンバーのメモリはオブジェクトと共に割り当てられ、メモリを明示的に使用Bookすることはできませんし、必要でもありません。delete基本的に、new呼び出しを使用して明示的な割り当てを一致させる必要がありdeleteますが、どこかに明示的に割り当てられていないものを解放する必要はありません。

delete titleつまり、またはを実行しようとするとエラーが発生しますdelete year。どこから来ているdelete authorsかによっては、しようとしたときにも発生する可能性があります。authors一般に、delete割り当てていないオブジェクトは必要ありません。あなたのクラスは、ベクトルBookの所有権を不当に取得する可能性があります。authors

于 2012-10-15T22:55:38.270 に答える
2

これはおそらく、Valgrind の使用法を学ぶ良い機会です。Valgrind を使用すると、この種のエラーに対するより豊富なデバッグ機能が提供されます。

デストラクタでは、ポインターを介してタイトルと年を破棄しています。これらは静的に割り当てられているため (つまり、new を使用して作成していないため)、実際にこれを行う必要はありません。したがって、動的に作成していないものを削除しようとしていると不平を言っています。

さらに、別のクラスに含まれるstd::vector同じものを参照できる を削除しています。std::vector同じ参照を含む 2 つのクラスが存在する可能性があるため、二重解放を呼び出さないように、これを削除するよりスマートな方法を見つける必要があります。

于 2012-10-15T22:55:35.337 に答える