Ich mache eine einfache Anwendung, die mich auf Sets arbeiten lässt. Die Anforderung besteht darin, die eingestellten Daten in einem dynamischen Array zu halten. Ich habe jedoch ein Problem, das ich nicht eingrenzen kann.Ungültige Adresse angegeben zu RtlValidateHeap
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());
}
}
Also, wenn ich die Debug-Code eingeben, Programm endet mit einer solchen Fehler, obwohl korrekte Ergebnisse auf einer Konsole angezeigt werden:
HEAP [Sets.exe]: Ungültige Adresse zu RtlValidateHeap angegeben (00830000, 00854A30) Sets.exe hat einen Haltepunkt ausgelöst.
Dann versuche ich, die Frage zu verengen, indem Sie manuell den Code Zeile für Zeile ausgeführt wird, passiert nichts, führt kein Fehler zeigt, Programm korrekt.
Dann, wenn ich versuche, es ohne das Debuggen zu laufen, wieder einmal, die richtigen Daten in der Konsole zeigt jedoch Programm endet mit einem „Application Sets.exe funktioniert nicht mehr“
Ich glaube, dass es einige nicht sein müssen Allocated Zeiger verursacht alle Probleme, aber ich kann nicht sehen, wo das Problem liegt. Kannst du mir bitte Helfen?
Sie Design scheint seltsam, verwenden Sie 'int *', um interne Elemente zu speichern, aber dann verwenden Sie ' std :: vector ', um die Summe zwischen zwei' SetArray' zu berechnen. Warum bleibst du nicht einfach bei 'std :: vector', was den Speicher für dich verwaltet und wahrscheinlich jedes Problem behebt? – Jack
kann ich einfach nicht. Wie ich schon sagte, ich muss Werte des Sets in einem dynamischen Array speichern. Ich wählte einfach Vektor, um die Daten zu manipulieren, weil es bequemer ist. – user3756824
Eigentlich ist ein 'std :: vector' ein dynamisches Array. In jedem Fall übergeben Sie einen Stack, der 'int []' dem von Ihnen erstellten 'SetArray' zugeordnet wurde. Dadurch werden beim Beenden des Bereichs ungeordnete Zeiger erzeugt. – Jack