编辑字符串时接收内存泄漏

时间:2015-01-29 19:46:37

标签: c++ string memory-leaks console-application

string Player::CalcAsteroid(int _mass)
{
vector<BaseObject*>* tempObjects = GameState::GetObjects();

asteroid = "";

SetRadius(_mass / 100);
if (_mass < 100)
    SetRadius(1);

///////////////////////////////////////////////
// Nested for loops to draw a circle (asteroid)
///////////////////////////////////////////////

// x^2/a^2 + y^2/b^2 = 1

Player* p = dynamic_cast<Player*> ((*tempObjects)[0]);
int asteroidRadius = p->GetRadius();
double consoleRatio = 4.0 / 3.0; // Console characters do not have uniform H and W, so lets store the console ratio (4:3)
double a = consoleRatio*asteroidRadius; // The width is shorter than the height, so we'll multiply the ratio to the X radius (a)
double b = asteroidRadius; // The height need not change from the init radius

// Loop though each row...
for (int y = (int)-asteroidRadius; y <= asteroidRadius; y++)
{
    // and each column.
    for (int x = (int)floor(-consoleRatio*asteroidRadius); x <= consoleRatio*asteroidRadius; x++)
    {
        double d = (x / a)*(x / a) + (y / b)*(y / b); // Equation of a circle (see above)
        if (d > 0.90 && d < 1.1)
        {
            asteroid += (char)178; // The solid border (using gradient ASCII code)
        }
        //else if (d <= 1.1)
        //{
            //asteroid += 176; // The fill interior
        //}
        else
        {
            asteroid += " ";
        }
    }
    asteroid += '\n';
}
asteroid.replace(asteroid.size() / 2 - (name.size() / 2), name.size(), name); // Putting the name of the player in the center of the asteroid.
return asteroid;
}

所以我试图在控制台中重新调整播放器对象(小行星)的大小。然而,我似乎得到了内存泄漏,实际上是一吨。每个似乎都与这个函数调用有关。 SetPicture(CalcAsteroid(GetMass()).c_str()); 其定义在这里

void SetPicture(const char * const _picture){ picture = _strdup(_picture);CalcWH(); }

CalcWH();只需以碰撞数据的字符计算图像的宽度和高度。

Dropbox链接以获得完整解决方案。

提前谢谢大家!让我知道我能做些什么来使我的问题更清楚,或者我是否有足够的信息。我是这个网站的新手,我希望遵循良好的问题习惯。

1 个答案:

答案 0 :(得分:2)

内存泄漏的原因是_strdup的使用。这为新字符串分配内存。您有责任在代码中的某处使用free释放内存。根据您发布的代码,您不会在任何地方调用free

https://msdn.microsoft.com/en-us/library/y471khhc.aspx

如上所述:

_strdup函数调用 malloc 为strSource副本分配存储空间,然后将strSource复制到分配的空间。


我的建议是退出调用_strdup的业务,并使用std::string。 C ++应用程序几乎没有理由使用strdup等函数。