无法在类的结构中达到内存错误

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::vectorstd::string 在 C++ 中实例化时也不需要关键字 struct。您可以使用std::liststd::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 在结构化矩阵中达到特定索引

为结构“错误”分配内存

shmget 如何分配内存?无法使用线性寻址访问(地址边界错误)

全局结构内存错误