1

我正在使用 Ubuntu。g++ 版本 4.7.2。

任何人都可以帮助我获得 gnu-extension 单一列表吗?我在这里编译了这些东西,并在执行时得到了核心转储。

我对其进行了调试,发现核心转储发生在第一行,它抛出了一个我无法解决的错误。有人可以帮我吗?

错误代码:

std::allocator<char>::allocator (this=0x7fffffffe4d0)
at /build/buildd/gcc-4.7-4.7.2/build/x86_64-linux-gnu/libstdc++-v3/include/bits/allocator.h:104
104 /build/buildd/gcc-4.7-4.7.2/build/x86_64-linux-gnu/libstdc++-v3/include/bits/allocator.h: No such file or directory.

这是我的测试代码:

#include <ext/slist>
#include <cstring>
#include <iostream>

int main(int argc, char * argv[])
{
    __gnu_cxx::slist<char> li(&argv[1][0], &(argv[1][strlen(argv[1])]));

    if(argc != 3)
        return 1;

    std::cout << "SList: ";
    for(__gnu_cxx::slist<char>::iterator i = li.begin();
            i != li.end();
            ++i)
        std::cout << *i;
    std::cout << std::endl;

    li.remove(argv[2][0]);

    for(__gnu_cxx::slist<char>::iterator i = li.begin();
            i != li.end();
            ++i)
        std::cout << *i;
    std::cout << std::endl;

    return 0;
}//main
4

1 回答 1

2

我的猜测是您在运行它时没有提供任何命令行参数。它需要两个:放入列表的字符序列和要删除的字符序列。

更新:如评论中所述,要在使用时将参数传递给您的程序gdb,您需要使用该--args选项来指示应将程序名称后面的参数传递给程序,而不是传递给gdb它自己:

gdb --args a.out xxyyxx x
    ^^^^^^

它在检查该参数是否存在argv[1] 之前从第一个参数初始化列表;如果没有,那么您将获得未定义的行为。如果您将检查移到 的声明之上li,那么在这种情况下程序应该退出并返回代码 1。

然后调试器抱怨它找不到源文件,因此无法向您显示出错的源代码行。

顺便说一句,C++ 标准库现在包括一个单链表std::forward_list,定义在 中<forward_list>,您可以使用它来代替 GNU 的扩展。

于 2012-12-12T13:53:52.480 回答