-1

私はこのようなものを持っています:いくつかのメモリを割り当てるメンバー関数を持つクラス。関数の終了時に、ポインターが NULL を指すように設定されるのはなぜですか?

class A
{

private:
    int* memoryblock;
public:
    void assignsome(int n);

};

void A::assignsome(int n)
{
    memoryblock = new int[n]; // At this point, debugger suggests memoryblock is not pointing to null.
}
// On exit of this function, memoryblock points to null!

リクエストに応じて: 完全な内訳は次のとおりです。

int FileHandler::PerValueMemoryBlockRead(char* delimarray, unsigned int sizeofarray)
{
// File Opened and mValues_n calculated.
    mValues = new int[mValues_n + 1];
    mValuesAllocated = true;

// Assignment of the contents of mValues is done.

    mValues[next_value_pos] = 0x0; // Last int set to zero. /// next_value_pos is an int which is incremented. (Code Removed because there is no point showing it.)
    return 0;

}

void FileHandler::SerialPrint()
{
    if(mValuesAllocated){
        std::cout << "Address:" << mValues << std::endl;
        std::cout << "Size=" << mValues_n << "B" << std::endl;
        for(ull pr = 0; pr < mValues_n; pr ++){
            std::cout << (int)mValues[pr] << " ";
        }
        std::cout << std::endl;
    }
    else{
        std::cout << "Nothing to print. 'PerValueMemoryBlockRead' has not yet been called." << std::endl;
    }
}

次にメイン内:

    if((!datahandle.PerValueMemoryBlockRead(delimarray, 3))
    && (!converthandle.PerValueMemoryBlockRead(delimarray, 3))
    && dataoutput.is_open()){

        dataoutput.seekp(0, std::ios::beg);

        // Code
        converthandle.SerialPrint(); // SEG FAULT
        datahandle.SerialPrint(); // SEG FAULT
        // End Code    
4

3 に答える 3

0

そこにブレークポイントを設定しても、デバッガーはまだその行を実行していません。

次の行に進んで、割り当てられていることを確認します。

于 2013-02-05T13:18:00.010 に答える
0

このような場合、デバッガーは少し誤解を招く可能性があります。実際、ポインタはNULLではなく、デバッガは単に混乱していて、どちらAについて話しているのかわかりません。同様のケースで疑わしい場合は、デバッグ印刷を使用することをお勧めします。

于 2013-02-05T13:18:48.497 に答える
0

を呼び出した後、 のインスタンスのA値が NULL と等しくないことがわかります。memoryblockassignsome

class A
{
private:
    int* memoryblock;
public:
    void assignsome(int n);
};

void A::assignsome(int n)
{
    memoryblock = new int[n];
}

int main () {
    A a;
    a.assignsome(5);
    return 0; // breakpoint here - a.memoryblock isn't NULL
}
于 2013-02-05T13:33:44.660 に答える