我正在研究一个项目,每次去设置示例[4] .m_dArray [3]时,程序都会崩溃。我可以设置每个其他变量的值,直到我得到示例[4] .m_dArray [3]。任何帮助将不胜感激!
Prog1Class.h:
#include "Prog1Struct.h"
#pragma once
#include <iostream>
#include <string.h>
using namespace std;
class Prog1Class
{
private:
Prog1Struct example[4];
public:
Prog1Class();
~Prog1Class ();
void setStructData();
void getStructData();
void ptrFunction();
void refFunction();
void printStruct();
void printData();
};
Prog1Struct.h:
#pragma once
#include <string.h>
struct Prog1Struct {
int m_iVal;
double m_dArray[4];
char m_sLine[80];
};
Prog1Class.cpp:
#include "Prog1Class.h"
#include "Prog1Struct.h"
#include <iostream>
#include <string.h>
using namespace std;
Prog1Class::Prog1Class()
{
}
Prog1Class::~Prog1Class()
{
delete &example[4];
}
int main()
{
Prog1Class *aClass = new Prog1Class();
aClass->setStructData();
aClass->printData();
return 0;
}
void Prog1Class::setStructData()
{
for(int i=0;i<5;i++)
{
cout << "Enter an integer: ";
cin >> example[i].m_iVal;
for(int j=0;j<5;j++)
{
cout << endl << "Enter a double: ";
cin >> example[i].m_dArray[j];
}
cout << endl << "Enter a string: ";
cin.ignore(256,'\n');
cin.getline(example[i].m_sLine, 80, '\n');
cout << endl;
}
}
void Prog1Class::getStructData()
{
}
void Prog1Class::printData()
{
for(int i=0;i<5;i++)
{
cout << example[i].m_iVal;
for(int j=0;j<5;j++)
{
cout << example[i].m_dArray[j];
}
cout << example[i].m_sLine;
}
}
答案 0 :(得分:1)
首先,delete &example[4];
应为delete [] example;
其次,你在哪里为example
分配内存?
答案 1 :(得分:1)
您需要更改此
class Prog1Class
{
private:
Prog1Struct example[4];
到这个
class Prog1Class
{
private:
Prog1Struct example[5];
在C ++数组中,从索引0开始,因此大小为4的数组的有效索引为0到3。您正在使用example[4]
,因此需要一个(至少)大小为5的数组。
您还需要从析构函数中删除delete &example[4];
。
答案 2 :(得分:0)
您需要显示example
对象的声明方式吗?我怀疑它有一些错误分配或误报的问题。你的setStructureData
表面上没有任何错误(假设数组大小匹配且字符串大小合适 - 它是一个char数组,而不是一个指针,对吗?)。< / p>
答案 3 :(得分:0)
数组删除是delete [] example
,不是你的方式。此外,要使用delete
new
数据
以下是如何使用new
和delete
#include <iostream>
struct foo
{
foo() {std::cout <<"constructed\n";}
~foo() {std::cout <<"destroyed\n";}
};
int main ()
{
foo * pt;
pt = new foo[3];
delete[] pt;
return 0;
}
还有输出:
constructed
constructed
constructed
destroyed
destroyed
destroyed
我上了一篇关于new/delete
的课程,刚才看到了真正的问题:
example[4]
超出范围。如果使用4个元素声明数组,则意味着您只有索引0, 1, 2, 3
。
答案 4 :(得分:0)
for (int i = 0; i < 5; i++) // ^^^^^
由于您的数组只有4个空格,因此for
循环应该具有i < 4
的结束条件。此外,您的delete
应为delete[] example;
。