从函数返回指针给我随机数

时间:2014-08-21 08:28:09

标签: c++ arrays function pointers

我正在空闲时间制作一款小型控制台游戏,并且遇到了一个我无法尝试修复的错误。我用指针尝试了很多不同的东西,所以这只是我代码的最新版本。我一直在寻找和其他一些问题表明我可能正在经历内存泄漏,或者我正在读取数组之外的值(不了解如何)。但是,这些问题已经解决,但没有给我任何关于我的代码有什么问题的提示。

基本上,我有一个名为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的方法之前在这个确切的文件中为我工作,所以我不确切地知道我是如何得到这些错误或导致它们的原因。我甚至尝试删除以前的指针,看看那是什么导致它,但它不是。 请停下来。

2 个答案:

答案 0 :(得分:3)

因为你返回一个指向局部变量的指针,并且当局部变量超出范围时你会有一个迷路指针。

不,你的分配没有帮助,因为你重新分配指针指向本地数组,而不是复制到分配的区域。这当然意味着你也有内存泄漏。


关于内存泄漏,即使修复了上述问题,仍会发生内存泄漏。原因是你从之前的函数返回delete[]指针,并且return立即从函数返回,return语句之后的所有代码都死了码。这意味着每次调用该函数时,它都会分配永远不会自由的新内存。

上述两个问题有两个明显的解决方案:一个是分配内存,将数组复制到已分配的内存中,然后返回指针,在调用者中执行{{1}在指针上。

第二个解决方案是传入一个数组作为参数,并使用它而不是本地delete[]数组。

答案 1 :(得分:0)

p_stats是指向int。

的指针

首先,将它分配给内存中新分配的位置。

然后将指针移动到指向本地存储并返回该指针。我的猜测是你真的想要回归stats。您的选择是:

  • 返回std :: vector&lt; int&gt;。可能最简单。
  • 修改您的函数以获取数据和长度的缓冲区并填入。
  • 如果可用,请返回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>