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。它仅在填充阵列后才分配给!编译器猜不出它的值。我不认为他试图使用构造函数。