5

現在、「0xC0000005: Access violation reading location 0xccccccce0」が表示されます。エラーが発生し、問題の診断を試みました...定義した3のルールが機能し、ここに私を向けたときに問題が発生したと思います。

size_type size() const
    {   // return length of sequence
    return (this->_Mysize); <---------------------this line
    }

実際に問題があるかどうかはわかりません。私はこれについて何日も続けてきました。

以下は私の3つのルールです

ArrayStorage::ArrayStorage(){
     myArray = new string[7079];
}

ArrayStorage::~ArrayStorage(){
    delete[] _data;
    delete[] myArray;
}

ArrayStorage::ArrayStorage(const ArrayStorage &A) {
    _size = A.size();
    _data = new string [size()];
    for (int i = 0; i < size(); ++i)
        _data[i] = A[i];
}

ArrayStorage& ArrayStorage::operator=(const ArrayStorage &A){
    if (this != &A) {
        delete [] _data;
        _size = A.size();
        _data = new string [A.size()];
        for (int i = 0; i < size(); ++i) {
             _data[i] = A[i];
        }
    }
    return *this;
}

const string& ArrayStorage::operator[](int i) const{
    assert((i >= 0) && (i < size()));
    return _data[i];
}

string& ArrayStorage::operator[](int i){
    assert((i >= 0) && (i < size()));
    return _data[i];
}
4

4 に答える 4

9

初期化されていない場合、msvc でコンパイルされている場合、スタック変数は 0xCC バイトで埋められます。したがって、0xccccccce0 はおそらく、「this」がスタック上の初期化されていないポインター変数と、オブジェクト構造内の _MySize オフセットの結果です。

于 2012-04-10T09:34:03.270 に答える
1

コードには明らかな問題がいくつかあります。たとえば、デストラクタは adelete [] _dataと adelete [] myArrayを 実行_dataしますが、デフォルト コンストラクタでmyArray 初期化されず、コピー コンストラクタで初期化されません。また、たとえば失敗した場合、代入演算子はオブジェクトを無効な状態のままにすることがnew できます。(一般に、自己代入をテストする必要がある場合は、代入演算子が壊れていることはほぼ確実です。) これらの問題のいずれかが原因で未定義の動作が発生し、フリー スペース アリーナが破損する可能性があり、後で問題が発生する可能性があります。

sizeそれでも、どこで呼び出されたかを見るのは興味深いでしょう。エラー メッセージは、無効なthis;を示唆しています。無効なアドレスで関数を呼び出したこと。

于 2012-04-10T09:34:54.273 に答える
0

ブレークポイント/ウォッチリスト。これはヌルだと思います。

于 2012-04-10T09:31:08.810 に答える
0

ポインターの問題だと思いますが、スタックトレース/バックトラックなしではわかりません。どこかで、ArrayStorage があると思われるアドレスで size() を呼び出していますが、ありません。0xccccce0 なので、初期化されたポインターを使用します。

例えばこんなのありますか

ArrayStorage storage1;
ArrayStorage* storage2;
*storage2 = storage1;

これは、このポインターが無効な、または同様のエラーになります。

そして、なぜ独自の std::vector を書いているのですか?

于 2012-04-10T09:39:36.957 に答える