【问题标题】:Heap corruption detected error in VS, but working fine with other IDE堆损坏在 VS 中检测到错误,但在其他 IDE 中工作正常
【发布时间】:2017-03-12 17:27:41
【问题描述】:

我正在使用 VoidPtr 做一些事情,当我在 Quincy 或 Eclipse 等其他 IDE 上测试我的代码时,运行它们没有任何问题。

但是,当我尝试在 Visual Studio 2015 中运行我的代码时,显示效果很好,但我偶然发现了一个名为

的错误

检测到堆损坏:在(某个地址)的正常块 #138 之后

我找不到错误在哪里,因为它显示了一个指针的地址,这对我来说更难调试。

我正在尝试合并 2 个 void 指针数组的数据。

void unionAnimalArray(VoidPtr* animalArray, int size, VoidPtr* animalArray2, int size2)
{
    int sizeu;

    VoidPtr *vpArray = &animalArray[0];
    VoidPtr *vpArray2 = &animalArray2[0];
    VoidPtr *end = &animalArray2[size2];

    VoidPtr *su = new VoidPtr[12];
    su = animalArray;

    sizeu = size;

    VoidPtr tempu;

    bool check;

    while (vpArray2 != end)
    {
        do
        {
            tempu = *vpArray2;
            check = true;
            for (int j = 0; j<size; j++)
            {
                if (j == 0)
                    vpArray = &animalArray[0];
                if (*(static_cast<Animal*>(tempu)) == *(static_cast<Animal*>(*vpArray)))
                {
                    check = false;
                    break;
                }
                ++vpArray;
            }
            if (!check)
                ++vpArray2;
        } while (!check && vpArray2 != end);

        if (vpArray2 != end)
        {
            vpArray = &su[sizeu];
            *vpArray = tempu;
            ++sizeu;
            ++vpArray2;
        }
    }
    cout << "The union is" << endl;
    cout << "\t{";
    printAnimalArray(su, sizeu);

    delete[]su;

}

【问题讨论】:

  • 最有可能出现未定义的行为。

标签: c++ visual-studio-2012 heap-memory


【解决方案1】:
void unionAnimalArray(VoidPtr* animalArray, int size, VoidPtr* animalArray2, int size2)
...
VoidPtr *su = new VoidPtr[12]; // su points to new memory
su = animalArray; // su now points to same memory as animalArray2
...
delete[]su; // deletes memory shared with animalArray2

数组应该按元素复制而不是赋值:

for(int i = 0; i < size2; ++i) {
    su[i] = animalArray[i];
}

您可以将缓冲区su 保存在自动内存中,因为您知道编译时缓冲区的大小:

VoidPtr su[12];

【讨论】:

  • 我相信,这不是问题,因为当我尝试将我的 2 voidpointer 与上述方法相交时很好,但是当我尝试合并它们时,问题就发生了。尽管如此,我尝试了你的方法,但不知何故问题仍然存在。
  • 我相信,这不是问题 这肯定是一个错误。它可能不是唯一的错误,但原始代码是错误的。
【解决方案2】:

想一想:

VoidPtr *su = new VoidPtr[12];
su = animalArray;

12 个新的 VoidPtr-s 去哪儿了? 谁以及何时将被删除?

【讨论】:

  • 我已经在函数末尾删除了它们delete[]su
  • 但是,您并没有删除使用new VoidPtr[12]; 分配的缓冲区,而是尝试删除animalArray 指向的缓冲区,这可能是双重删除,具体取决于animalArray 的分配方式.
  • @TeoChuenWeiBryan:不,你没有。在执行su = animalArray 之后,su 不再持有新返回的指针。你删除了另一件事,事实上——你不应该这样做。指针之间的赋值并不像你想象的那样。
猜你喜欢
  • 1970-01-01
  • 2013-10-12
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多