我正在制作一个简单的应用程序,可让我在场景上进行操作。要求将其保存在动态数组中。但是,我有一个问题,我无法缩小范围。
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已停止工作”结尾
我相信一定有一些未分配的指针导致了所有问题,但是我看不出问题出在哪里。请你帮助我好吗?
最佳答案
dynamicArray = new int(vector1.size());
很小的错字。这应该是
dynamicArray = new int[vector1.size()];
其他
new
分配也一样。同样,您的班级,按设计,将泄漏内存。但这将是一个不同的问题。
附言我也无法立即看到该错误。乍一看,代码对我来说还不错。但是在我的调试器中花了不到一分钟的时间找到了它。您应该花一些时间来学习如何使用调试器。它可以在stackoverflow.com上帮助您查找代码中的错误,而不必等待随机的陌生人为您提供帮助
关于c++ - 指定给RtlValidateHeap的地址无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37312318/