首页 > 解决方案 > 我无法弄清楚的 Valgrind 错误

问题描述

这是我运行程序时发生的 valgrind 错误。

==137479== Conditional jump or move depends on uninitialised value(s)
==137479==    at 0x400B50: sdds::Ship::setShipEmpty() (Ship.cpp:25)
==137479==    by 0x400AF2: sdds::Ship::Ship() (Ship.cpp:20)
==137479==    by 0x401181: main (main_prof.cpp:49)
==137479==
==137479== Invalid write of size 1
==137479==    at 0x40097A: sdds::Engine::setEmpty() (Engine.cpp:19)
==137479==    by 0x400B3E: sdds::Ship::setShipEmpty() (Ship.cpp:26)
==137479==    by 0x400AF2: sdds::Ship::Ship() (Ship.cpp:20)
==137479==    by 0x401181: main (main_prof.cpp:49)
==137479==  Address 0x1fff001018 is not stack'd, malloc'd or (recently) free'd

我目前的程序是静态的,不使用动态内存分配,目标是创建一个函数来将变量设置为安全的空状态。当对象有效时,相应地设置它。这是我在 Ship.cpp 中的函数。同样,将engine.cpp 函数设置为空状态也几乎相同。

    Ship::Ship()
    {
        setShipEmpty();
    }
    void Ship::setShipEmpty()
    {
        m_type[0] = '\0';
        for (int i = 0; i < m_engCnt; i++) {
            m_engines[i].setEmpty();
        m_engCnt = 0;
        }}
    
    Ship::Ship(const char* sType, const Engine* engines, int sizeOfEngine)
    {
        if (sType != nullptr && strlen(sType) > 0 && strlen(sType) < TYPE_MAX_SIZE && engines[0].get() > 0 && sizeOfEngine < 10) 
        {
            strcpy(m_type, sType);
            m_engCnt= sizeOfEngine ;

            for (int i = 0; i < sizeOfEngine; i++) {
                m_engines[i] = engines[i];
            }}
        else {
            setShipEmpty();
        }}

船.h 文件

class Ship
    { ...private:
        Engine m_engines[10];
        char m_type[TYPE_MAX_SIZE+1];
        int m_engCnt;
      ....

引擎.h 文件

const int TYPE_MAX_SIZE = 30;
    
    class Engine
    {
        double m_size;
        char m_type[TYPE_MAX_SIZE+1];
     public:...

引擎.cpp

    void Engine::setEmpty()
    {
        m_type[0] = 0;
        m_size = 0;
    }

    Engine::Engine()
    {
        setEmpty();
    }

    Engine::Engine (const char* type, double size)
    {
        setEmpty();
        strcpy(m_type, type);
        m_size = size;
    }

标签: c++valgrind

解决方案


Valgrind 抱怨您没有设置值,m_engCnt但您在 for 循环中使用它。鉴于这m_engines是一个Engine[10],我想您希望该循环仅从 0 变为 10。

两点改进:

  • 为它创建一个默认构造函数,它现在Engine可以做任何事情setEmpty。这将允许您跳过Ship构造函数中的 for 循环。
  • 更好的是,切换到 astd::vector<Engine>这样您就不必Engine在开始时手动初始化您永远不会使用的 s。

推荐阅读