【问题标题】:c++. valgrind outputs: Syscall param open(filename) points to unaddressable byte(s)c++。 valgrind 输出:系统调用参数 open(filename) 指向不可寻址字节
【发布时间】:2013-11-23 18:57:15
【问题描述】:

我正在做一个小项目,其中包括解析一些文件。 当我用 valgrind 检查我的项目时,我得到了这个错误:

Syscall param open(filename) points to unaddressable byte(s)

根据我的理解(和阅读),这意味着我发送了一个未定义、空或已删除的内存,但我不知道为什么......

这是engine.cpp。它的构造函数从控制台接收“char** argv”变量

//alot of includes and using namespace std.

Engine::Engine(char** args) {
    processConfFile(args[1]);
}

void Engine::processConfFile ( char* fileName) {
    string* fileContent = fileToString(fileName); //this line is specified at the stacktrace
    stringstream contentstream(*fileContent);
// parsing and stuff
    delete fileContent;
}

string* Engine::fileToString(const char* fileName) const{
    string* content = new string();
    ifstream ifs (fileName); // this line produces the error
    if (ifs) {
        content->assign((istreambuf_iterator<char>(ifs)), (istreambuf_iterator<char>()));
        ifs.close();
    }
    else {
        //TODO logger error.
    }
    return content;
}

你知道是什么导致了这个问题吗? 提前谢谢。

P.S:代码运行良好。文件被正确读取和解析。

【问题讨论】:

    标签: c++ memory-leaks valgrind


    【解决方案1】:

    我的第一个猜测是,当您构造 Engine 时,args[1] 没有得到很好的定义/分配。你期望在 **args 中有什么?你怎么称呼你的构造函数?我猜想在 main 中类似于 Engine(argv),但是如果您从未检查 argc 是否大于 1,那么您将传递一个具有未初始化内存的数组,并且当您最终尝试使用它时它会窒息。

    【讨论】:

    • 你的猜测是正确的。它像你写的那样直接从 main 调用,正如我所说的程序运行正确,所以它显然定义了而不是 null。你认为 valgrind 会检查我是否检查了 argc?
    • 当您运行程序时,您是否向它传递任何参数? argv 是你的命令行参数的数组,argv[0] 是命令名,argv[1] 是第一个参数,等等。如果你没有传递任何参数,**argv 不会为空,argv [0] 将被填充,但 argv[1] 将成为垃圾 - 可能不为空,但可能不包含有用的数据。
    • 我的 main 用 4 个参数调用,我直接发送到引擎。
    • 嗯...错过了关于代码实际工作的 ps。如果您只是在您的main 中添加一个类似for (int i = 0; i &lt; argc; ++i) cout &lt;&lt; argv[i] &lt;&lt; endl; 的循环,valgrind 是否会抱怨该循环上的未初始化值?您编译时是否进行了任何优化?
    • 我主要添加了这个,valgrind 不会抱怨它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    • 2015-09-21
    相关资源
    最近更新 更多