C++内存堆,动态设置数组

C++内存堆,动态设置数组,c++,arrays,class,C++,Arrays,Class,我有一个问题,我认为这与堆内存有关。 非常感谢您的帮助 这是在部落标题中: Survivor* SurvivorsArray = new Survivor[MaxSurvivorsInTribe]; class Tribe{ public: char NameOfTribe[20]; int MaxSurvivorsInTribe; **Survivor* SurvivorsArray = new Survivor[MaxSurvivorsInTribe];** int Number

我有一个问题,我认为这与堆内存有关。 非常感谢您的帮助

这是在部落标题中:

Survivor* SurvivorsArray = new Survivor[MaxSurvivorsInTribe]; 
class Tribe{

public: 

char NameOfTribe[20];
int MaxSurvivorsInTribe;
**Survivor* SurvivorsArray = new Survivor[MaxSurvivorsInTribe];** 
int NumbersOfSurvivorsInTribe;   
void tribe(char name[20], int maxSurvivor);

};

#endif
这是我的问题。 当我写作时

Survivor* SurvivorsArray = new Survivor[MaxSurvivorsInTribe]; 
我遇到了这个问题:

EXE3.exe has triggered a breakpoint.
这是我的输入代码,用于:

    if (_crtheap == 0) {
#if !defined (_CRT_APP) || defined (_DEBUG)
    _FF_MSGBANNER();    /* write run-time error banner */
    _NMSG_WRITE(_RT_CRT_NOTINIT);  /* write message */
#endif  /* !defined (_CRT_APP) || defined (_DEBUG) */
    __crtExitProcess(255);  /* normally _exit(255) */
}

return HeapAlloc(_crtheap, 0, size ? size : 1);
}
但如果我写:

Survivor* SurvivorsArray = new Survivor[100]; 
因此,它的工作没有错误

目前,仅当我设置了一个预设数组时它才起作用,但如果我想从用户那里获取数组大小,我会得到一个错误

主要内容:

#include <iostream>
#include <string>
using namespace std;

#include "survivor.h"
#include "tribe.h"
int main(){
Tribe t1;
Tribe t2;
char nameTribe1[20]; 
int maxTribe1;
cout << "Enter name of first tribe: " << endl;
cin >> nameTribe1;
cout << "Enter max of survivors to first tribe(max 100): " << endl;
cin >> maxTribe1;
t1.tribe(nameTribe1, maxTribe1);

char nameTribe2[20];
int maxTribe2;

cout << "Enter name of second tribe: " << endl;
cin >> nameTribe2;
cout << "Enter max of survivors to second tribe(max 100): " << endl;
cin >> maxTribe2;
t2.tribe(nameTribe2, maxTribe2);
return 0;
}
幸存者cpp:

#include "survivor.h"
#include <iostream>

using namespace std;
void Survivor::survivor(char name[20], int age, double sWidgth){
for (int i = 0; i < 20; i++)
    NameOfSurvivor[i] = name[i];

Age = age;
StartWidgth = sWidgth;
FinalWidgth = -1;
}//end survivor
部落cpp:

#include "tribe.h"
#include <string>
#include <iostream>

using namespace std;

void Tribe::tribe(char name[20], int maxSurvivor){
for (int i = 0; i < 20; i++)
    NameOfTribe[i] = name[i];


for (int i = 0; i < maxSurvivor; i++){
    for (int j = 0; j < 20; j++){
        SurvivorsArray[i].NameOfSurvivor[j] = ' ';
    }//end for
    SurvivorsArray[i].Age = 0;
    SurvivorsArray[i].StartWidgth = 0;
    SurvivorsArray[i].FinalWidgth = 0;

    MaxSurvivorsInTribe = maxSurvivor;
    NumbersOfSurvivorsInTribe = 0;
}//end for
}//end tribe

谢谢。您不能在类声明中执行动态分配。将数组分配移动到部落构造函数


顺便说一下,除非出于某种原因禁止您使用STL,否则最好使用向量而不是数组

您的代码失败,因为它试图调用新函数来创建大小未定义的缓冲区。当您第一次声明部落变量时,如下所示:

Tribe t1;
Tribe t2;
char nameTribe1[20]; 
int maxTribe1;
cout << "Enter name of first tribe: " << endl;
cin >> nameTribe1;
cout << "Enter max of survivors to first tribe(max 100): " << endl;
cin >> maxTribe1;
Tribe t1(nameTribe1, maxTribe1);
您正在触发隐式默认构造函数,该构造函数将尝试创建对象。用于数组大小的值MaxSurvivorIntribe是部落类的一个局部字段,该字段随后未初始化为任何值

您可能应该进行一些代码重组,在实例化部落对象之前收集每个部落的大小和名称,然后提供一个接受最大大小和名称值的构造函数,该构造函数还可以分配数组所需的空间。比如:

int main(){
char nameTribe1[20]; 
int maxTribe1;
cout << "Enter name of first tribe: " << endl;
cin >> nameTribe1;
cout << "Enter max of survivors to first tribe(max 100): " << endl;
cin >> maxTribe1;

char nameTribe2[20];
int maxTribe2;

cout << "Enter name of second tribe: " << endl;
cin >> nameTribe2;
cout << "Enter max of survivors to second tribe(max 100): " << endl;
cin >> maxTribe2;

Tribe t1(nameTribe1,maxTribe1);
Tribe t2(nameTribe2,maxTribe2);
}
正如其他人所指出的,如果您使用std::vector作为容器,甚至使用std::string来保存您的名字以避免潜在的错误,您将得到更好的服务

class Tribe{

public: 

std::string NameOfTribe;
int MaxSurvivorsInTribe = 0;
std::vector<Survivor> SurvivorsArray;
int NumbersOfSurvivorsInTribe = 0;   

Tribe(std::string name, int maxSurvivor) : MaxSurvivorsInTribe(maxSurvivor), NameOfTribe(name)
{
}
};

为阵列分配内存时,MaxSurvivorIntribe似乎未初始化。默认情况下,它可以有任何整数值。您可以将指针用作字段并在构造函数中初始化它:

class Tribe{
...
int MaxSurvivorsInTribe;
Survivor* SurvivorsArray;
Tribe(char* name, int maxSurvivor){
   MaxSurvivorsInTribe = maxSurvivor;
   Survivor* SurvivorsArray = new Survivor[MaxSurvivorsInTribe];
   ....      
}
别忘了释放析构函数中的内存:

~Tribe(){
   delete Survivor;
}

<>你需要更多地了解C++和动态数组中的类。

你的构造函数没有正确的格式化,你把:

void tribe(char name[20], int maxSurvivor);
但应该是这样

Tribe(char name[20], int maxSurvivor);
由于无法正确初始化,因此未设置MaxSurvivorIntribe,无法使用

然后在main中,您将按如下方式初始化它:

Tribe t1;
Tribe t2;
char nameTribe1[20]; 
int maxTribe1;
cout << "Enter name of first tribe: " << endl;
cin >> nameTribe1;
cout << "Enter max of survivors to first tribe(max 100): " << endl;
cin >> maxTribe1;
Tribe t1(nameTribe1, maxTribe1);

为什么您的include语句在main函数中?如果你把它们放在上面,名称空间也放在上面,它能工作吗?不,对不起,我在网站上写得很糟糕。我解决了这个问题。我在VS2013上做了一个快速测试,当使用常量大小时,它编译得非常干净。我没料到。看看你的代码,我看到了许多其他问题。考虑将其放入代码审查堆栈交换站点。当试图将其作为参数传递给新运算符时,甚至不定义Max IsVistValueTrbe。它仅在填充阵列后才分配给!编译器猜不出它的值。我不认为他试图使用构造函数。