5

次のコードがありますが、Myclass のデストラクタにヒットしたときに、ヒープ破損が検出されたというエラーが発生する理由がわかりません。メモリの割り当てを適切に解除していると思いますか??

#include <iostream>
#include <vector>
using namespace std;

class MyClass{
private:
    char* mp_str;
public:
    MyClass():mp_str(NULL){}
    ~MyClass(){
        delete [] mp_str;
    }

    void setString(const char* str);
    void printString();
};

int main(){
    MyClass* a = new MyClass();
    std::vector<MyClass> myVector;

    myVector.push_back(*a);

    a->setString("Hello World");
    myVector[0].setString("Goodbye world");

    a->printString();
    myVector[0].printString();

    return 1;
}

void MyClass::setString(const char* const str){
    if(!str)
        return;

    size_t len = strlen(str);

    if(!this->mp_str){
        this->mp_str = new char[len];
        memset(mp_str, 0, len+1);
    }
    strncpy(mp_str, str, len);
}

void MyClass::printString(){
    if(this->mp_str)
        cout << mp_str;
    else
        cout << "No string found";
}

編集:(固定コード)

void MyClass::setString(const char* const str){
    if(!str)
        return;

    size_t len = strlen(str);

    if(!this->mp_str){
        this->mp_str = new char[len+1];
        memset(mp_str, 0, len+1);
    }
    strncpy(mp_str, str, len);
}

main() で、私も追加しました

delete a;

return 1 を呼び出す前に;

4

2 に答える 2

8

null を考慮して、文字列の長さ +1 を割り当てる必要があります。あなたはそれを正しく設定しています。

if(!this->mp_str){
    this->mp_str = new char[len+1];
    memset(mp_str, 0, len+1);
}
于 2012-07-26T19:03:49.683 に答える
1

(本来あるべきように、ラファエルの回答が受け入れられた後に投稿されました。)

バッファ オーバーランがこの特定のクラッシュの根本的な原因であることは間違いありませんが、Rule of Threeを順守するように調整しながら実装を簡素化することで、クラッシュを回避できた可能性があります。つまり、( を処理するために) デストラクタを実装したのでmp_str、コピー コンストラクタと代入演算子も実装する必要があります。

しかし、TRoT に準拠するもう 1 つの方法は、これらの実装をまったく必要としないことです。この場合、 a のstd::string代わりに aを使用するchar *と、クラッシュが解決され、TRoT 準拠になります。

class MyClass{
private:
    std::string mp_str;
public:
    void setString(const char* str) { mp_str = str ? str : ""; }
    void printString() {
        if (mp_str.size()) std::cout << mp_str;
        else std::cout << "(mp_str is empty)";
    }
};
于 2012-07-26T19:34:30.850 に答える