【问题标题】:valgrind invalid read of size 4, where is the error?valgrind 无效读取大小为 4,错误在哪里?
【发布时间】:2010-10-02 17:21:15
【问题描述】:

我是 valgrind 的新手,我正在尝试用它来解决内存泄漏和其他内存问题。在我的程序中,我定义了以下类

class LM_EXPORT LdpElement : public Visitable, virtual public RefCounted,
                             public NodeInTree<LdpElement>
{
protected:
    ELdpElement m_type;     // the element type
    std::string m_name;     // for composite: element name
    std::string m_value;    // for simple: the element value
    bool m_fSimple;         // true for simple elements
    int m_numLine;          // file line in which the element starts or 0
    long m_id;              // for composite: element ID (0..n)
    ImoObj* m_pImo;

    LdpElement();

public:
    virtual ~LdpElement();

    //getters and setters
    ...
    inline ImoObj* get_imo() { return m_pImo; }

Valgrind 在最后一行抱怨“无效读取大小为 4”。为什么?返回指针的内存问题在哪里?

【问题讨论】:

  • 如果没有 actual valgrind 输出,您的问题将无法回答。问题肯定不是在最后一行,而是在其他地方。
  • 你是对的。解决其他内存问题后问题消失。很抱歉没有早点回答。我昨天看到了你的答案,然后回来尝试解决 Valgrid 问题。你的建议是解决这个问题的关键。谢谢。
  • 这是个好问题,但没有答案。

标签: memory-leaks valgrind


【解决方案1】:

也许m_pImo 没有初始化并且valgrind 不喜欢这样?你的构造函数的实现是否有一个初始化列表来初始化m_pImo

【讨论】:

  • 返回未初始化的值不会触发 valgrind 错误。请不要提供虚假的答案。
  • 感谢您的信息。现在每个不知道的人都学到了一些新东西。但是,我不会避免发布基于合理假设(例如未初始化数据)的建议。这就是赞成/反对票的用途。如果我的建议太错误以至于可能有害,我会删除它。
【解决方案2】:

在很高的层次上,不一定总是原因,我看到有时 Valgrind 会抱怨,所以当你的最终(调试)二进制(可执行文件)中有多个符号时(当链接器选项设置为false 表示“死代码剥离”)。

我希望这将在未来对其他人有所帮助。我在浪费了 2 个小时后才发现这一点。 :(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2021-12-03
    相关资源
    最近更新 更多