C++ c++;-访问冲突读取位置0xCCCC

C++ c++;-访问冲突读取位置0xCCCC,c++,C++,我正在使用一个名为tArray的对象,它是一个对象数组,可以正确地执行所有其他任务。我需要从对象数组中使用buyerName形成一个字符串数组,以填充新数组,然后返回它。然而,正如我的标题所述,我不断地犯错误,有人知道为什么吗?到目前为止,我在我的程序中只使用了这种方法。谢谢 第一段代码用于调用Analyzer类中的方法 std::string *topBuyers = analyser.topFiveBuyers(); for(int idx = 0; idx < 5; idx++)

我正在使用一个名为tArray的对象,它是一个对象数组,可以正确地执行所有其他任务。我需要从对象数组中使用buyerName形成一个字符串数组,以填充新数组,然后返回它。然而,正如我的标题所述,我不断地犯错误,有人知道为什么吗?到目前为止,我在我的程序中只使用了这种方法。谢谢

第一段代码用于调用Analyzer类中的方法

std::string *topBuyers = analyser.topFiveBuyers();
for(int idx = 0; idx < 5; idx++)
    std::cout << "Top buyer" << (idx+1) << ": " << topBuyers[idx] << std::endl;
std::cout << std::endl;
delete [] topBuyers;

您正在从
topfievebullers
返回指向临时变量的指针

正确的方法是从方法中返回
向量
数组
,而不是
字符串*


如果出于某些非常奇怪的原因,您必须返回一个指针,那么您需要使用
new
-分配空间,以及随之而来的所有问题,因为被调用方必须在返回指针之后进行清理。您当前使用的是函数范围内的自动存储,不能保证在函数返回后仍然可用/可访问,因此您的访问冲突。

是的。根据我的记忆,VisualStudio调试器会填充您在0xCCCC中未使用的所有其他内存位置,以便在访问内存时显示您不应该使用的内存(在本例中,包含临时对象的堆栈帧后的堆栈已被销毁)@我同意你在我的答案中所编辑的内容的普遍看法,但总的来说,对其他人的答案进行如此大量的编辑在我看来有点不合时宜。感谢你的回复,这只是一些家庭作业的一小部分,我现在不想更改指针。然而,我不知道如何解决这个问题,我很困惑:/它可能打在我的脸上,但我看不见它lol@us2012很抱歉,我仍然感觉到我可以编辑多少或者何时编辑。我认为最好是将信息整合成一个单一的答案,而不是有本质上相同的竞争答案。我遵从您的判断,根据需要编辑:)@AlcoJaguar无需担心(无论如何,谢谢您的建议!)。我还看到我甚至不能责怪你,因为你的编辑应该在评论队列中,而评论人显然认为这是可以的。Oh well:).0xCCCC是未初始化的内存
string* Analyser::topFiveBuyers()
{
const int sSize = 5;

string calcString[sSize] = {tArray[0].buyerName, tArray[1].buyerName, 
tArray[2].buyerName, tArray[3].buyerName, tArray[4].buyerName}; 

return calcString;
}