在阵列中设置数据时程序崩溃

时间:2013-10-08 20:47:01

标签: c++ arrays

我正在研究一个项目,每次去设置示例[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;
    }
}

5 个答案:

答案 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数据

以下是如何使用newdelete

的小例子
#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;