为什么在迭代这个字符串时会出现分段错误?

the*_*nel 5 c++ iterator

我正在尝试用C++实现一个基本的移位密码.在找出导致分段错误的原因之前,我不能继续前进.我使用gdb逐步完成代码,问题似乎源于迭代器.

 1 #include <iostream>
 2 #include <string>
 3 
 4 std::string encrypt (std::string plain, int key);
 5 
 6 int main()
 7 {
 8         std::string plaintext;
 9         std::getline(std::cin,plaintext,'\n');
 10        encrypt(plaintext,3);   
 11 }
 12 
 13 std::string encrypt(std::string plain, int key)
 14 {
 15         std::string::iterator ic;
 16         for (ic= plain.begin(); ic != plain.end();++ic)
 17         {
 18                 std::cout <<*ic + key << std::endl;
 19         }
 20 }
Run Code Online (Sandbox Code Playgroud)

错误:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b73ef1 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() () from /usr/lib/libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 8

您已声明encrypt为返回an std::string,但您不从函数返回任何内容.您需要返回一个值,或者您需要将返回类型更改void为指示该函数不返回任何内容.

至于为什么它会像写的那样崩溃,我只能推测.编译器可能已生成对std::string析构函数的调用main以清理返回的std::string对象encrypt.由于encrypt实际上并没有返回任何东西,析构函数最终会被调用一个不存在的对象.应该包含对象的内存可能只包含垃圾数据,析构函数不喜欢它.


nob*_*bar 5

[C++ 2003标准第6.6.3-2节]流出函数末尾相当于没有值的返回值; 这会导致值返回函数中的未定义行为.

如果您的编译器没有警告您,这是一个非常容易犯的错误.通过启用尽可能多的编译器警告,您可以节省大量调试.在gcc/g ++的情况下,我建议使用"-Wall -Werror"为您正在编写的任何新代码进行编译.使用这些选项,此程序的编译失败,并显示以下消息:

cc1plus: warnings being treated as errors
In function 'std::string encrypt(std::string, int)':
Line 20: warning: control reaches end of non-void function
Run Code Online (Sandbox Code Playgroud)