2016-05-19 3 views
0

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?

+0

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

+0

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

+0

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

Antwort

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

Sehr kleiner Tippfehler. Dies sollte auch

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

Das Gleiche gilt für die anderen new Zuordnung sein.

Auch Ihre Klasse, wie entworfen, wird Speicher verlieren. Aber das wäre eine andere Frage.

P.S. Ich konnte den Virus auch nicht sofort sehen. Der Code sah auf den ersten Blick gut aus. Aber es dauerte weniger als eine Minute, um es in meinem Debugger zu finden. Sie sollten einige Zeit damit verbringen, zu lernen, wie Sie einen Debugger verwenden. Es wird Ihnen helfen, Fehler in Ihrem Code zu finden, anstatt auf zufällige Fremde warten zu müssen, auf stackoverflow.com

Verwandte Themen