为什么使用 'new' 创建的数组设置为 NULL?

Why does array created with 'new' become set to NULL?

本文关键字:设置 NULL 数组 new 为什么 创建      更新时间:2023-10-16

我有这样的东西:一个带有成员函数的类,它分配一些内存。为什么在函数退出时,指针会被设置为指向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    

如果将断点放在那里,调试器仍然没有运行该行。

继续到下一行以查看其已分配。

在这种情况下,调试器可能会有点误导。事实上,指针不是NULL,调试器只是感到困惑,不知道您在说哪个A。我建议在类似情况下有疑问时使用调试打印。

在调用assignsome:后,您应该看到A的实例的值memoryblock不等于NULL

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
}