指向从函数返回的结构的 C++ 指针导致访问冲突
C++ pointer to struct returned from function causes access violation
我是 C++ 新手。我使用 Visual Studio。我的调试版本按预期工作,但发布版本因访问冲突而崩溃。
结构:
struct GeneticData
{
int NumberOfIdDataPairs;
char** IdBuffer;
char** DataBuffer;
};
IdBuffer 是一个包含 20 个字符的字符数组,Databuffer 是一个包含 102 个字符的字符数组。
returns指针所在的函数:
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]
调试器在此处停止(post 即时调试):
使用 cout << geneticData.DataBuffer[1][0]
调试器停在这一行。在分析 DataBuffer 内容的实际算法中,调试器会停止,就像 cout << geneticData.DataBuffer[1][0]
的情况一样。
我将GeneticData结构的内存分配为动态内存,我不明白为什么在LoadData函数后指针无效returns它。
您正在返回一个指向临时结构的指针:
GeneticData geneticData = *new GeneticData(); // memoryleak: copies from dynamic memory into local
...
return &geneticData; // returns address of local memory
如果你想初始化一个本地结构写:
GeneticData geneticData; // calls the default constructor GeneticData() to initialise geneticData
请注意,geneticData
仅在范围结束之前有效,该变量的地址也是如此!
如果需要动态内存写:
GeneticData* pGeneticData = new GeneticData(); // allocates dynamic memory (new), calls the default constructor and assigns the memory address to the pointer pGeneticData
你必须更换
GeneticData geneticData = *new GeneticData();
来自
GeneticData* geneticData = new GeneticData(); // we define a pointer now
和
return &geneticData;
来自
return geneticData; // return the pointer
但是尽量避免使用原始指针,除非你真的知道自己在做什么。
GeneticData geneticData = *new GeneticData();
这个怪物动态分配一个对象,用它来复制初始化一个局部变量,然后丢弃指向它的唯一指针,导致内存泄漏。
return &geneticData;
这个 return 是一个指向局部变量的指针,它在调用者可以对它做任何事情之前被销毁;导致你的错误。
也许您想 return 动态对象(记得在使用完后将其删除):
GeneticData * geneticData = new GeneticData();
//...
return geneticData;
或者您可能想要 return 一个对象的值:
GeneticData LoadData(FILE* dataFilePtr)
{
GeneticData geneticData;
//...
return geneticData;
}
但你应该帮自己一个忙,不要再乱搞指针和 new
。使用 std::vector
作为缓冲区。
我是 C++ 新手。我使用 Visual Studio。我的调试版本按预期工作,但发布版本因访问冲突而崩溃。 结构:
struct GeneticData
{
int NumberOfIdDataPairs;
char** IdBuffer;
char** DataBuffer;
};
IdBuffer 是一个包含 20 个字符的字符数组,Databuffer 是一个包含 102 个字符的字符数组。 returns指针所在的函数:
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]
调试器在此处停止(post 即时调试):
使用 cout << geneticData.DataBuffer[1][0]
调试器停在这一行。在分析 DataBuffer 内容的实际算法中,调试器会停止,就像 cout << geneticData.DataBuffer[1][0]
的情况一样。
我将GeneticData结构的内存分配为动态内存,我不明白为什么在LoadData函数后指针无效returns它。
您正在返回一个指向临时结构的指针:
GeneticData geneticData = *new GeneticData(); // memoryleak: copies from dynamic memory into local
...
return &geneticData; // returns address of local memory
如果你想初始化一个本地结构写:
GeneticData geneticData; // calls the default constructor GeneticData() to initialise geneticData
请注意,geneticData
仅在范围结束之前有效,该变量的地址也是如此!
如果需要动态内存写:
GeneticData* pGeneticData = new GeneticData(); // allocates dynamic memory (new), calls the default constructor and assigns the memory address to the pointer pGeneticData
你必须更换
GeneticData geneticData = *new GeneticData();
来自
GeneticData* geneticData = new GeneticData(); // we define a pointer now
和
return &geneticData;
来自
return geneticData; // return the pointer
但是尽量避免使用原始指针,除非你真的知道自己在做什么。
GeneticData geneticData = *new GeneticData();
这个怪物动态分配一个对象,用它来复制初始化一个局部变量,然后丢弃指向它的唯一指针,导致内存泄漏。
return &geneticData;
这个 return 是一个指向局部变量的指针,它在调用者可以对它做任何事情之前被销毁;导致你的错误。
也许您想 return 动态对象(记得在使用完后将其删除):
GeneticData * geneticData = new GeneticData();
//...
return geneticData;
或者您可能想要 return 一个对象的值:
GeneticData LoadData(FILE* dataFilePtr)
{
GeneticData geneticData;
//...
return geneticData;
}
但你应该帮自己一个忙,不要再乱搞指针和 new
。使用 std::vector
作为缓冲区。