【问题标题】:Invalid address specified to RtlValidateHeap指定给 RtlValidateHeap 的地址无效
【发布时间】:2016-05-19 01:02:06
【问题描述】:

我正在制作一个简单的应用程序,让我可以对场景进行操作。需求是将集合数据保存在动态数组中。但是,我遇到了一个无法缩小范围的问题。

Sets.cpp:

#include "stdafx.h"
#include "SetArray.h"


int main()


{

int a1[] = { 1,2,3,4,5 };
int a2[] = { 5,6,7,8 };

SetArray arr1 = SetArray(a1, (sizeof(a1) / sizeof(*a1)));
SetArray arr2 = SetArray(a2, (sizeof(a2) / sizeof(*a2)));
arr2.printSet();

SetArray arr3 = arr1 + arr2;
arr3.printSet();

return 0;
}

SetArray.h:

#pragma once

#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
class SetArray
{
public:

SetArray(int * elems, int count);
~SetArray();

friend SetArray operator+(SetArray &set1, SetArray &set2);

int * getArray();
int getArraySize();
void printSet();
int * elemsArray;
private:

int count = 0;
};

SetArray.cpp:

#include "stdafx.h"
#include "SetArray.h"


SetArray::SetArray(int * elems, int count)
{
    elemsArray = elems;
    SetArray::count = count;

}


SetArray::~SetArray()
{
}

int * SetArray::getArray()
{
    return elemsArray;
}

int SetArray::getArraySize()
{
    return count;

}

void SetArray::printSet() 
{
    for (int i = 0; i < count; i++)
    {
        std::cout << elemsArray[i] << std::endl;
    }
}

SetArray operator+(SetArray & set1, SetArray & set2)
{
std::vector<int> vector1;
std::vector<int> vector2;

for (int x = 0; x < set1.count; x++)
{
    vector1.push_back(set1.elemsArray[x]);
}
for (int x = 0; x < set2.count; x++)
{
    vector2.push_back(set2.elemsArray[x]);
}

if (vector1.size() >= vector2.size())
{
    for (int i = 0; i < vector2.size(); i++) 
    {
        if (std::find(vector1.begin(), vector1.end(), vector2[i]) == vector1.end())
        {
            vector1.push_back(vector2[i]);
        }
    }

    int * dynamicArray;
    dynamicArray = new int(vector1.size());

    for (int j = 0; j < vector1.size(); j++)
    {
        dynamicArray[j] = vector1[j];
    }

    return SetArray(dynamicArray, vector1.size());



}
else
{
    for (int i = 0; i < vector1.size(); i++)
    {
        if (std::find(vector2.begin(), vector2.end(), vector1[i]) == vector2.end())
        {
            vector2.push_back(vector1[i]);
        }
    }

    int * dynamicArray;
    dynamicArray = new int(vector2.size());

    for (int j = 0; j < vector2.size(); j++)
    {
        dynamicArray[j] = vector2[j];
    }

    return SetArray(dynamicArray, vector2.size());

    }

}

所以,当我输入调试代码时,程序以这样的错误结束,尽管在控制台上显示了正确的结果:

HEAP[Sets.exe]: 指定给 RtlValidateHeap(00830000, 00854A30) 的地址无效 Sets.exe 已触发断点。

然后我尝试通过手动逐行执行代码来缩小问题范围,没有任何反应,没有错误显示,程序正确执行。

然后,当我尝试在不调试的情况下运行它时,再次在控制台中显示正确的数据,但是程序以“Application Sets.exe 已停止工作”结束

我相信一定有一些非定位指针导致了所有问题,但我看不出问题出在哪里。你能帮帮我吗?

【问题讨论】:

  • 你的设计看起来很奇怪,你使用int* 来存储内部元素,然后你使用std::vector 来计算两个SetArray 之间的总和。你为什么不坚持使用std::vector,它将为你管理内存并可能解决任何问题?
  • 我不能。就像我说的,我需要将集合的值存储在动态数组中。我只是选择了向量来操作数据,因为它更方便。
  • 其实std::vector是一个动态数组。在任何情况下,您都将分配int[] 的堆栈传递给您创建的SetArray,这将在退出范围时创建悬空指针。

标签: c++ pointers memory


【解决方案1】:
dynamicArray = new int(vector1.size());

非常小的错字。这应该是

dynamicArray = new int[vector1.size()];

其他new 分配也是如此。

此外,按照设计,您的课程会泄漏内存。但那将是一个不同的问题。

附:我也无法立即看到错误。乍一看,代码对我来说很好。但是在我的调试器中不到一分钟就找到了它。您应该花一些时间学习如何使用调试器。它将帮助您在 stackoverflow.com 上找到代码中的错误,而不必等待随机的陌生人来帮助您

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-15
    • 2016-07-13
    • 1970-01-01
    • 2020-05-04
    • 2020-08-10
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多