指向从函数返回的结构的 C++ 指针导致访问冲突

标签 c++ pointers

<分区>

我是 C++ 新手。我使用 Visual Studio。我的调试版本按预期工作,但发布版本因访问冲突而崩溃。 结构:

struct GeneticData
{
    int NumberOfIdDataPairs;
    char** IdBuffer;
    char** DataBuffer;
};

IdBuffer 是一个包含 20 个字符的字符数组,Databuffer 是一个包含 102 个字符的字符数组。 返回指针的函数:

GeneticData* LoadData(FILE* dataFilePtr) //dataFilePtr is valid in the function
{
    char* result = NULL;
    int fileLine = 0;
    GeneticData geneticData = *new GeneticData();

    geneticData.NumberOfIdDataPairs = *new int;
    geneticData.IdBuffer = new char*[gSizeOfBuffer];
    geneticData.DataBuffer = new char*[gSizeOfBuffer];

    for (int i = 0; i < gSizeOfBuffer; i++)
    {
        geneticData.IdBuffer[i] = new char[gSizeOfId];
        geneticData.DataBuffer[i] = new char[gSizeOfData];
    }

    do
    {
        result = fgets(geneticData.IdBuffer[fileLine], gSizeOfId, dataFilePtr);
        fgets(geneticData.DataBuffer[fileLine], gSizeOfData, dataFilePtr);
        fileLine++;
    } while (result != NULL && fileLine < gSizeOfBuffer);

    if (result != NULL)
        geneticData.NumberOfIdDataPairs = fileLine;
    else
        geneticData.NumberOfIdDataPairs = fileLine - 1;

    return &geneticData;
}

gSizeofBuffer 是 id/data 对的数量,目前它的值为 1.000.000。 在函数内部一切正常,我可以访问 id/dataBuffer 的值。问题出现在调用我的 LoadData 函数的函数中。

GeneticData geneticData;
geneticData = *LoadData(dataFilePtr);
//acces violation, geneticData contained invalid values

cout << geneticData.DataBuffer[1]调试器在这里停止(事后调试): enter image description here

cout << geneticData.DataBuffer[1][0]调试器停在这一行。在分析 DataBuffer 内容的实际算法中,调试器会停止,就像 cout << geneticData.DataBuffer[1][0] 的情况一样。 . 我将 GeneticData 结构的内存分配为动态内存,我不明白为什么在 LoadData 函数返回后指针无效。

最佳答案

GeneticData geneticData = *new GeneticData();

这个怪物动态分配一个对象,用它来复制初始化一个局部变量,然后丢弃指向它的唯一指针,导致内存泄漏。

return &geneticData;

这将返回一个指向局部变量的指针,该变量在调用者可以对其进行任何操作之前被销毁;导致你的错误。

也许您想返回动态对象(记得在使用完后将其删除):

GeneticData * geneticData = new GeneticData();
//...
return geneticData;

或者您可能想按值返回一个对象:

GeneticData LoadData(FILE* dataFilePtr)
{
    GeneticData geneticData;
    //...
    return geneticData;
}

但是你应该帮自己一个忙,不要再乱搞指针和new了。使用 std::vector 作为缓冲区。

关于指向从函数返回的结构的 C++ 指针导致访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27967474/

相关文章:

c++ - 坏指针 : expression can not be evaluated while parsing tokens

c++ - 关于在 C++ 中比较两个与指针相关的整数值的意外结果

pointers - [Golang]指针类型、指针类型和结构体类型调用方法有什么不同?

c - 指向未知或不完整结构的指针

c++ - 如何将对象传递给c++中的函数?

c++ - 声明数组导致错误

C++ pthreads - 使用我在 C 中使用的代码给我一个转换错误

pointers - 如何在MQL中定义指向类的静态指针?

c++ - Qt 双击检查鼠标左键

c++ - std deque 出奇地慢