我用初始化列表给指针开堆区空间,在释放空间的时候VStudio报错

我用初始化列表给指针开堆区空间,在释放空间的时候VS报错,报错如下:

img

img


我的代码如下:

InstructionQueue::InstructionQueue(unsigned char size): size(size + 1), front(0), rear(0), instruction(new char[this->size])
{
}
InstructionQueue::~InstructionQueue()
{
    delete[] instruction;
    if (instruction)
    {
        instruction = nullptr;
    }
}

我使用的是VS2022。
我有尝试过寻找原因:
1.不是重复释放空间问题,因为我写了深拷贝构造,重复释放是另一种报错提示。
2.就报错是出在delete[]那一句,因为注释掉就正常运行了。但是问题是出在初始化列表,因为把初始化列表改成构造函数内开空间,就不会出现这个问题。
3.如果不使用初始化列表,在构造函数内开空间也没有报错:

InstructionQueue::InstructionQueue(unsigned char size): size(size + 1), front(0), rear(0)
{
    instruction = new char[this->size];
}

4.我尝试问gpt,gpt说没有任何问题,提供的推荐方法也都无法解决这个问题。
请赐教,万分感激!

这种指针初始化写在初始化列表的写法比较罕见,我们通常都是下面那种写法,放在构造函数里去写。
我怀疑是CRT检测机制存在误报。
你可以反汇编跟踪下

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    根据您提供的问题和参考资料,以及我现有的知识,我能给出具体的解决方案。您遇到的问题是在释放堆区空间时发生Visual Studio错误。根据您提供的代码,错误出现在析构函数中的delete[]语句上。

    这个问题可能是由于指针的内存分配和释放不一致导致的。在您的构造函数中,您使用了初始化列表为ptr指针分配堆区空间,但是在析构函数中尝试使用delete[]释放该空间时出错。这可能是因为您的指针在构造函数中分配的内存和在析构函数中释放的内存不一致。

    要解决这个问题,您可以尝试以下解决方案:

    1. 确保在每次分配内存之前都先释放旧的内存。在构造函数中,您可以先检查ptr是否为nullptr,如果不是,则先使用delete[]释放旧的内存。然后,再为ptr分配新的堆区空间。
    ClassName::ClassName(int size) : ptr(nullptr) {
        if (ptr != nullptr) {
            delete[] ptr;
        }
        ptr = new int[size];
    }
    
    1. 在析构函数中,检查ptr是否为nullptr,如果不是,则使用delete[]释放堆区空间。然后,将ptr设置为nullptr,以避免重复释放。
    ClassName::~ClassName() {
        if (ptr != nullptr) {
            delete[] ptr;
            ptr = nullptr;
        }
    }
    

    这样,每次对象被销毁时,ptr指向的堆区空间会被正确释放,避免了重复释放和悬挂指针的问题。

    请注意,这仅是一个解决方案的示例,具体解决方案可能因您的代码和环境而有所不同。如果问题仍然存在,请尝试在程序的其他部分检查指针的使用情况,确保没有其他地方对同一块内存进行了释放或未初始化的操作。

    希望这个解决方案能帮助到您!如果您有任何其他问题,请随时提问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^