[英]C ++ - Problem saving values - values change after saving
我已经尝试了几天来解决内存问题。
我有一个程序,用户可以在其中输入向量及其名称。
该程序将所有内容存储在vector类中。
问题是当我打印矢量时,这些值会更改为其他值。
我的意思是在Vector :: Vector中名称为“ array ”的数组
有人知道问题可能在哪里吗?
Main.cpp:
# include "Midgam.h"
int main(int argc, char **argv) {
Midgam m(3,20),m1();
m.Start();
m.~Midgam();
return 0;
}
Midgam.cpp:
#include "Midgam.h"
Midgam::Midgam(int num_of_boxes, int num_of_parties):boxNum(num_of_boxes),maxParties(num_of_parties) {
iterator = 0;
midgam = new Vector[maxParties];
}
Midgam::~Midgam() {
if(midgam)
for(int i=0; i < iterator; i++)
midgam[i].~Vector();
delete [] midgam;
}
void Midgam::Start(){
int choice;
while (choice != 6){
cout << "Please enter your choice" << endl;
cin >> choice;
switch (choice) {
case 1:
AddParty();
break;
case 2:
cout << "case 2" << endl;
break;
case 3:
cout << "case 3" << endl;
break;
case 4:
cout << "case 4" << endl;
break;
case 5:
cout << "case 5" << endl;
break;
case 6:
break;
default :
cerr << "ERROR: invalid command; type 6 for exit" << endl;
}
}
cout << "END OF PROGRAM" << endl;
}
void Midgam::AddParty(){
string name;
cout << "Print All:" << endl;
PrintAll();
cout << "Insert name:" << endl;
cin >> name;
if (name.size() > 12){
cerr << "Party name is too long, please don't pass the 12 characters!!!" << endl;
return;
}
cout << "Insert values:" << endl;
Vector v(name,boxNum);
if (!v.getBool()){
cerr << "ERROR: invalid input" << endl;
return;
}
int exist = FindPartyByName(name);
cout << "exist: " << exist << endl;
if(exist != -1){
cout << "EXIST" << endl;
midgam[exist]=v;
return;
}
cout << "iterator: " << iterator <<endl;
if(iterator >= maxParties){
cerr << "ERROR: no more new parties" << endl;
return;
}
cout << "iteraator: " << iterator << endl;
midgam[iterator]=v;
iterator++;
}
int Midgam::FindPartyByName(string party){
for (int i=0; i < iterator; i++){
if (party.compare(midgam[i].getName()) == 0){
return i;
}
}
return -1;
}
void Midgam::PrintAll(){
for(int i=0; i < iterator; i++){
cout << midgam[i].getName() << endl;
midgam[i].PrintArray();
}
}
Midgam.h:
#include <iostream>
#include <string>
#include "Vector.h"
using namespace std;
#ifndef MIDGAM_H_
#define MIDGAM_H_
class Midgam {
private:
int boxNum;
int maxParties;
int iterator;
Vector *midgam;
public:
Midgam(int num_of_boxes, int num_of_parties);
virtual ~Midgam();
void Start();
void AddParty();
int FindPartyByName(string party);
void PrintAll();
};
#endif /* MIDGAM_H_ */
Vector.cpp:
#include "Vector.h"
Vector::Vector(string name,int size):name(name),size(size){
array = new unsigned int[size];
string results;
cin.ignore();
getline(cin,results);
Bool = StringToArray(results);
}
Vector::Vector(const Vector &v2){
name=v2.name;
size=v2.size;
Bool=v2.Bool;
array = new unsigned int[size];
for(int i=0; i < size; i++)
array[i]=v2.array[i];
}
Vector::Vector(){
name="";
size=0;
array=NULL;
Bool=true;
}
Vector::~Vector() {
if(array)
delete [] array;
}
bool Vector::StringToArray(string str){
stringstream ss(str);
for(int i=0; i < size ; i++){
if(ss.eof())
return false;
ss >> array[i];
cout << array[i];
}
if(!ss.eof())
return false;
return true;
}
bool Vector::getBool(){
return Bool;
}
string Vector::getName(){
return name;
}
void Vector::PrintArray(){
for(int i=0; i < size; i++)
cout << array[i] << " ";
cout << endl;
}
Vector.h:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
#ifndef VECTOR_H_
#define VECTOR_H_
class Vector {
private:
string name;
int size;
unsigned int *array;
bool Bool;
public:
Vector(string name,int size);
Vector();
Vector(const Vector &v2);
virtual ~Vector();
bool StringToArray(string str);
bool getBool();
string getName();
void PrintArray();
};
#endif /* VECTOR_H_ */
正如评论说你错过了定义运算符= 矢量 ,所以默认运算符=用于定义和一个副本,而无需克隆阵列的内容。
因此,当您进行midgam[iterator]=v;
您共享v.array
但是在删除v时删除了该数组,之后又以未定义的行为访问PrintAll中的已删除数组:在您的情况下,它不打印期望值。
您只需要定义operator =即可 ,例如作为Vector(const Vector &v2)
:
Vector & Vector::operator=(const Vector &v2) {
if(array)
delete [] array;
// from Vector(const Vector &v2)`
name=v2.name;
size=v2.size;
Bool=v2.Bool;
array = new unsigned int[size];
for(int i=0; i < size; i++)
array[i]=v2.array[i];
return *this;
}
之后执行是:
Please enter your choice
1
Print All:
Insert name:
aze
Insert values:
1 2 3
123exist: -1
iterator: 0
iteraator: 0
Please enter your choice
1
Print All:
aze
1 2 3
Insert name:
qsd
Insert values:
11 22 33
112233exist: -1
iterator: 1
iteraator: 1
Please enter your choice
1
Print All:
aze
1 2 3
qsd
11 22 33
Insert name:
^C
因此PrintAll产生了预期的输出
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.