2013-03-08 182 views
-1

我正在使用一个名为tArray的对象,它是一个对象数组,并且确实可以正常工作以执行所有其他任务。我需要使用对象数组中的buyerName形成一个字符串数组,以填充它的新数组,然后将其返回。然而,我不断收到我的标题所述的错误,有谁知道为什么?到目前为止,我只在这个方法上苦苦挣扎。感谢C++ - 访问冲突读取位置0xcccccccc

的代码这第一个块被用于调用该方法在我的分析器类

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; 

代码的下部分是有问题的方法。

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; 
} 
+0

0xCCCCCCCC是未初始化的内存[何时以及为什么OS将内存初始化为0xCD,0xDD等malloc/free/new/delete?](http://stackoverflow.com/q/370195/995714) – 2015-04-28 15:44:59

回答

5

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

正确的做法是从您的方法中返回vector<string>array<string,5>而不是string*

如果由于某种非常奇怪的原因,你绝对必须返回一个指针,你需要使用new分配空间 - 与所有随之而来的问题,因为调用者将有后清理。您目前正在功能范围内使用自动存储,但不能保证在函数返回后仍然可用/可访问,因此违反了您的访问。

+1

Yep 。从我记忆中,Visual Studio调试器填充了所有其他未使用的内存位置,使用0xcccccccc可以在访问内存时显而易见(在这种情况下,堆栈后的堆栈与这个临时对象已经被销毁了。) – Alex 2013-03-08 20:09:09

+0

@AlcoJaguar我同意你对我的回答编辑的一般情绪,但总的来说,对他人的回答进行实质性编辑在我的愚见中有点不合时宜。 – us2012 2013-03-08 20:14:22

+0

感谢您的回复,这是一些作业的一小部分,我宁愿不要立即改变指针。但我不能让我的脑袋周围如何解决这个问题,我很困惑:/它可能打在我的脸上,但我不能看到它大声笑 – user2075995 2013-03-08 20:15:10