-3

我正在做一个项目,每次我去设置 example[4].m_dArray[3] 时,程序都会崩溃。我可以设置所有其他变量的值,直到到达 example[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;
    }
}
4

5 回答 5

1

首先,delete &example[4];应该是delete [] example;

其次,你在哪里分配内存example

于 2013-10-08T20:50:28.977 回答
1

你需要改变这个

class Prog1Class
{
private:
    Prog1Struct example[4];

对此

class Prog1Class
{
private:
    Prog1Struct example[5];

在 C++ 中,数组从索引 0 开始,因此大小为 4 的数组的有效索引为 0 到 3。您正在使用example[4],因此您需要一个(至少)大小为 5 的数组。

您还需要delete &example[4];从析构函数中删除。

于 2013-10-08T20:57:21.273 回答
0

您需要显示example对象的声明方式吗?我怀疑它存在一些错误分配或错误声明的问题。你setStructureData没有做任何表面上的错误(假设数组大小匹配并且字符串的大小合适 -它是一个 char 数组,而不是指针,对吗?)。

于 2013-10-08T20:52:43.103 回答
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,仅此而已。

于 2013-10-08T20:57:20.903 回答
0
for (int i = 0; i < 5; i++)
//              ^^^^^

你的for循环应该有一个结束条件,i < 4因为你的数组只有 4 个空格。此外,您delete应该是delete[] example;.

于 2013-10-08T21:02:15.683 回答