无法在类的结构中达到内存错误
Posted
技术标签:
【中文标题】无法在类的结构中达到内存错误【英文标题】:unable to reach memory error in a struct in a class 【发布时间】:2016-05-17 08:27:17 【问题描述】:我有这个类用于保存收据:
class Recept
int Ingr_size;
char *Name;
char *Type;
char *Recipe;
struct Ingridient
char *aName;
float Mas;
*List_ingr;
当我尝试使用此功能保存成分名称或质量时:
void Recept::setIngr(const char * p, float mass)
struct Ingridient * temp = new struct Ingridient[Ingr_size + 1];
if (Ingr_size)
for (int i = 0; i < Ingr_size; i++)
temp[i] = List_ingr[i];
delete List_ingr;
List_ingr = temp;
List_ingr[Ingr_size].aName = new char[strlen(p) + 1];
strcpy(List_ingr[Ingr_size].aName, p);
List_ingr[Ingr_size].Mas = mass;
我收到“无法访问aName
内存”和“无法访问Mas
内存”的错误。
我找不到问题在哪里或为什么。
谢谢。
【问题讨论】:
你为什么不用std::vector
或std::string
?
在 C++ 中实例化时也不需要关键字 struct
。您可以使用std::list
或std::vector
来管理您的Ingridient 列表,而不是处理原始数组
【参考方案1】:
我收到“无法访问 aName 内存”和“无法访问 Mas 内存”的错误。
这是一个运行时异常,你还没有初始化你的类变量,你至少需要一个构造函数来做基本的默认初始化:
Recept() : Ingr_size(0), List_ingr(nullptr)
另外,如果 List_ingr
是 nullptr,你不应该尝试在 setIngr 中迭代它。
[编辑]
如果您的类中有上述构造函数(这不是问题),那么您还有其他错误,请参见下面的 cmets:
void Recept::setIngr(const char * p, float mass)
struct Ingridient * temp = new struct Ingridient[Ingr_size + 1];
if (Ingr_size)
for (int i = 0; i < Ingr_size; i++)
temp[i] = List_ingr[i];
delete List_ingr;
List_ingr = temp;
else
// !!! in case of Ingr_size you still need to set List_ingr,
List_ingr = temp;
List_ingr[Ingr_size].aName = new char[strlen(p) + 1];
strcpy(List_ingr[Ingr_size].aName, p);
List_ingr[Ingr_size].Mas = mass;
// !!! You need to increment size
Ingr_size++;
【讨论】:
如果使用new
分配资源,析构函数也不会受到伤害。
而在这种情况下,使用std::list
来管理成分列表会更安全
@***foe 还有一个拷贝赋值和拷贝构造函数(参见***.com/questions/4172722/what-is-the-rule-of-three)
@Garf365 同意,这个类需要所有的构造函数+析构函数
好吧,我的答案修复了这段代码中的未定义行为——这导致了崩溃——但绝不会使这段代码按预期工作,这需要更多的工作。至少实施 RAII。以上是关于无法在类的结构中达到内存错误的主要内容,如果未能解决你的问题,请参考以下文章
10 $digest() 迭代在 IE 中达到错误。不知道为啥
使用函数 find matlab 在结构化矩阵中达到特定索引