c++ - 我无法弄清楚的 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;
}
解决方案
Valgrind 抱怨您没有设置值,m_engCnt
但您在 for 循环中使用它。鉴于这m_engines
是一个Engine[10]
,我想您希望该循环仅从 0 变为 10。
两点改进:
- 为它创建一个默认构造函数,它现在
Engine
可以做任何事情setEmpty
。这将允许您跳过Ship
构造函数中的 for 循环。 - 更好的是,切换到 a
std::vector<Engine>
这样您就不必Engine
在开始时手动初始化您永远不会使用的 s。
推荐阅读
- angular - 如何从表格组件中读取值
- azure-devops - 意外的属性 pathtoPublish
- java - 过了一会儿,生产 spring boot 应用程序抛出 NoSuchBeanDefinitionException
- c# - 缓存健康检查网络核心
- postgresql - plv8 二进制文件复制到相应的文件夹,但在加载库时出错,因为找不到指定的过程
- mongodb - mongo.Connect() 在使用 mongo-go-driver 的 Go 中没有按预期工作
- javascript - 类型'(事件:FormEvent
) => void' 不能分配给类型 '() => any' - reactjs - graphql-查询数组/普通对象结果?
- postgresql - 使用触发器在 Postgresql 中复制数据库
- android - 在某些设备(三星、moto G3)中,带有文本的 vCard 附件在使用 android Intent 发送时不起作用