3

ListNode構造体をクラス形式に変更しようとしましたが、テスト時にいくつかの問題が発生しています。

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

chainLink.hpp 
#ifndef CHAINLINK_H
#define CHAINLINK_H

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

template <typename Object>

class chainLink
{
    private:
        Object storedValue;
        chainLink *nextLink;
    public:
            //Constructor
        chainLink(const Object &value = Object()): storedValue(value)
        {
            nextLink = NULL;
        }
        /* Postcondition:   returns storedValue;
         */     
        Object getValue()
        {
            return storedValue;
        }

        /* Postcondition:   sets storedValue = value
         */
        void setValue(Object &value)
        {
            storedValue = value;
        }

        /* Postcondition:   sets nextLink to &value
         */
        void setNextLink(chainLink* next)
        {
            nextLink = next;
        }

        chainLink* getNext()
        {
            return nextLink;
        }
        ~chainLink()
        {
            delete nextLink;
        }
};
#endif

私のテストファイルは、含まれていると仮定します

int main()
{
    chainLink<int> x(1);
    cout << "X: " << x.getValue() << " "<< endl;
    chainLink<int> y(2);
    cout << "Y: " << y.getValue() << " "<< endl;
    chainLink<int>* z = &y;
    cout << &y << " " << z << endl;
    x.setNextLink(z);
}

出力:X:1 Y:2 0x7fff65333b10 0x7fff65333b10 a.out(7016)malloc:*オブジェクト0x7fff65333b10のエラー:解放されるポインターが割り当てられませんでした*デバッグするためにmalloc_error_breakにブレークポイントを設定します中止トラップ:6

setNextLink関数によってエラーがスローされたようです。

どんな助けでも大歓迎です。

4

3 に答える 3

1

あなたの最後の行では、自動保存期間(のアドレスを保持している)を持つオブジェクトへのポインタでmain呼び出しています。リストは、ポインタが破棄されたときにそのポインタを削除しようとするため、エラーが発生します(動的に割り当てられていないため、動的に削除できません)。setNextLinkzyy

于 2012-09-04T06:34:40.797 に答える
1

setNextLink自動的に割り当てられた変数へのポインタを与えています。

x.setNextLink(z); // z points to automatic object y

コンストラクターで削除しようとします。

~chainLink() {
    delete nextLink; // attempts to delete automatic object y
}

動的に割り当てられたオブジェクトへのポインタを渡すか、独自のinsdeをchainLinkクラスにする必要があります。

:C ++では、structsとclassesは同じバーであり、いくつかの違いがあります。同等のタイプは、2つのいずれかを使用して実装できます。

于 2012-09-04T06:35:07.910 に答える
0

線がx.setNextLink(z); x.nextLinkを指している後z、それは次にを指しyます。しかし、yローカルオブジェクトです。ヒープではなくスタックに割り当てられます。したがって、それを要求deleteすることは違法です。

于 2012-09-04T06:42:23.380 に答える