我正在空闲时间制作一款小型控制台游戏,并且遇到了一个我无法尝试修复的错误。我用指针尝试了很多不同的东西,所以这只是我代码的最新版本。我一直在寻找和其他一些问题表明我可能正在经历内存泄漏,或者我正在读取数组之外的值(不了解如何)。但是,这些问题已经解决,但没有给我任何关于我的代码有什么问题的提示。
基本上,我有一个名为int * spendAttribute(int point);
的函数
由于在该函数中创建的任何内容超出了我的main()
范围,我想从该函数中取出6个int,并将它们带入我的main()
。
我想"嘿,为什么不用指针!"该函数应该返回一个指向函数期间创建的数组的指针,并将其粘贴到main()
中创建的另一个指针,这在我的main()中曾经工作过一次,但是现在它不起作用了我不知道为什么。
int * spendAttribute(int point)
{
string choice;
int hp,hpT,endur,endurT,dmg,dmgT,armor,armorT,agility,agilityT,evade,evadeT;
while(condition)
{
//do a bunch of junk ....
}
int stats[6] = {hp,endur,dmg,armor,agility,evade};
//some cout testing to see if values are correct (they are)
int* p_stats = new int [6]; //create a block of 6
p_stats = &stats[0]; //point to the first value of stats array
return p_stats; //return pointer
delete [] p_stats; //delete blocks
}
注意:我已尝试过不删除块但仍然无效。我试过这个,因为我读到它可能是一个内存泄漏。我已经尝试了它而没有使用新的。
main()
{
//.... some junk
while(main game loop)
{
int * pointer;
cout << "*************** Enter 'begin' to commence ****************** " << endl ;
cout << "*************** Enter 'spend' to use new attribute points ** " << endl ;
cin >> beginChoice; //declared before while loop
if(beginChoice == "spend")
{
cout << "total attributes: " << Bryan.returnAttribute() << endl ;
pointer = spendAttribute(Bryan.returnAttribute()); //copy pointer
cout << "TEST: " << endl ;
cout << pointer[0] << endl ; //out put is a bunch of random numbers..
cout << pointer[1] << endl ;
cout << pointer[2] << endl ;
cout << pointer[3] << endl ;
cout << pointer[4] << endl ;
cout << pointer[5] << endl ; //SOME DAMN BUG HERE
Bryan.addMaxHp(pointer[0]);
Bryan.addEndurance(pointer[0]);
Bryan.addDmg(pointer[0]);
Bryan.addArmor(pointer[0]);
Bryan.addAgility(pointer[0]);
Bryan.addEvasion(pointer[0]);
//after this character ends up having some ridiculous stats like -564553535%
//evasion or 9879967856 armor...
}
}
}
这个将阵列转移到main的方法之前在这个确切的文件中为我工作,所以我不确切地知道我是如何得到这些错误或导致它们的原因。我甚至尝试删除以前的指针,看看那是什么导致它,但它不是。 请停下来。
答案 0 :(得分:3)
因为你返回一个指向局部变量的指针,并且当局部变量超出范围时你会有一个迷路指针。
不,你的分配没有帮助,因为你重新分配指针指向本地数组,而不是复制到分配的区域。这当然意味着你也有内存泄漏。
关于内存泄漏,即使修复了上述问题,仍会发生内存泄漏。原因是你从之前的函数返回delete[]
指针,并且return
立即从函数返回,return
语句之后的所有代码都死了码。这意味着每次调用该函数时,它都会分配永远不会自由的新内存。
上述两个问题有两个明显的解决方案:一个是分配内存,将数组复制到已分配的内存中,然后返回指针,在调用者中执行{{1}在指针上。
第二个解决方案是传入一个数组作为参数,并使用它而不是本地delete[]
数组。
答案 1 :(得分:0)
p_stats
是指向int。
首先,将它分配给内存中新分配的位置。
然后将指针移动到指向本地存储并返回该指针。我的猜测是你真的想要回归stats
。您的选择是:
std::array
,您知道它的固定大小为6。虽然您可以将数据复制到p_stats
然后返回,但这并不理想,因为调用函数随后负责删除数据。
如果字段具有不同的含义,您可能希望为值创建一个具有有意义名称的结构,并使您的函数返回该结构。例如
struct SpendAttribute // in header
{
int hp;
int endur;
int dmg;
int armor;
int agility:
int evade
};
SpendAttribute spendAttribute( int point )
{
SpendAttribute res;
// enter code here
return res;
}
最后一个选择是将数据放入智能指针boost::shared_array<int>
,或者您可以将shared_ptr
与数组删除器一起使用。
现在,只需返回std::vector<int>