【问题标题】:C++ std::make_shared memory leakC++ std::make_shared 内存泄漏
【发布时间】:2012-12-26 05:18:04
【问题描述】:

以下代码行存在内存泄漏问题:

auto state = newSpriteState();

这些是相关的功能:

class SpriteState {
    protected:
        Vector3 position;
        int width, height;
        double rotation, scaling;
        int priority;

    public:
        SpriteState()
            : position(0,0,0),
            width(1), height(1),
            rotation(0), scaling(1.0f),
            priority(0)
        {}

    std::shared_ptr<SpriteState> newSpriteState()
    {
        return std::make_shared<SpriteState>();
    }
};

class Vector3 {
private:
    double x, y, z;

public:
    Vector3( double x_, double y_, double z_ )
    {
        x = x_; y = y_; z = z_;
    }
};

Intel Inspector 继续报告我在 函数newSpriteState();更具体地说是std::make_shared&lt;SpriteState&gt;()

更新

从 cmets 来看,这似乎有一些外部原因,所以这里有更多代码:

bool Sprite::loadImage() {
    auto state = newSpriteState();
    initStateVector(0, state);
}

地点:

class Sprite
{
public:
    Sprite();

    std::map<const int, const std::shared_ptr<SpriteState>> stateVector;

    void initStateVector(const int line, std::shared_ptr<SpriteState>& state)
    { 
        stateVector.clear(); 
        stateVector.insert(std::make_pair( line, std::move(state) )); 
    }

    void loadImage();
}

为了清楚起见,我已经上传了我实际使用的 Sprite 类的简化版本。

基本上,我分配了一个shared_ptr&lt;SpriteState&gt; 并在课堂Sprite 中坚持使用std::map

【问题讨论】:

  • state 创建后会发生什么?它是否存储在本身未正确释放的对象中?
  • 您是否保留对SpriteStates 的直接或间接全局引用?
  • 当它报告这个泄漏时,是在你让共享指针超出范围之前还是之后(或reset它)?如果你从不reset 共享指针并且从不让它超出范围,那么这将导致在newSpriteState 中分配的内存泄漏,但这不是newSpriteState 的错。
  • @K-ballo 我将 SpriteState 引用粘贴到地图中。我上传了更多代码来展示我在做什么。
  • @dk123:我的问题是:是否有任何类型为std::shared_ptr&lt;SpriteState&gt; 或直接或间接包含std::shared_ptr&lt;SpriteState&gt;s 的全局对象

标签: c++ memory memory-management


【解决方案1】:

升级到vs12后问题已解决。我最好的估计是这个问题与智能指针的 tr1 实现有关。

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 2014-03-24
    • 2011-11-09
    • 1970-01-01
    相关资源
    最近更新 更多