使用字符串时的c ++初学者分段错误

Posted

技术标签:

【中文标题】使用字符串时的c ++初学者分段错误【英文标题】:c++ beginner segmentation fault when using strings 【发布时间】:2014-03-10 16:32:16 【问题描述】:

我正在尝试使用 std::string 作为函数类型和变量类型来设置一个基本类,但是同时使用这两种类型会给我一个分段错误。如果我删除函数或变量,一切都很好。我确定我犯了一个非常愚蠢的错误!这是我的代码: main.cpp

#include <iostream>
#include <cstdlib>
#include <string>
#include "myclass.h"

int main()


    myclass obj;
    obj.replace();

    return EXIT_SUCCESS;
;

myclass.h

#ifndef MYCLASS_H_
#define MYCLASS_H_
#include <string>

class myclass

    private:
        std::string instruction;

    public:
        myclass();
        std::string replace();
; 

#endif

myclass.cpp

#include "myclass.h"
#include <iostream>


myclass::myclass()

    std::cout<<"I am the constructor"<<std::endl;


std::string myclass::replace()

    std::cout<<"I replace"<<std::endl;

【问题讨论】:

对于初学者,你说你会从 myclass::replace 返回一个 std::string 而你没有,所以这是个问题。 令我印象深刻的是,您甚至遇到了段错误。如果不返回错误,编译器至少应该警告您。 在和 tada 中添加了退货声明!非常感谢 faranwath @faranwath 添加你的答案,你会得到支持而不是你的评论。 @EricFortin:可悲的是,一些流行的编译器不会发出警告(更不用说拒绝带有警告的代码),除非你告诉他们。 【参考方案1】:

你说myclass::replace 每次被调用时都会返回一个std::string,但你实际上并没有returned 任何东西!然后发生的事情进入了未定义行为的领域,这通常意味着你的程序会行为不端,最终甚至会kill your cat。

解决方法是在函数末尾添加return语句。

【讨论】:

【参考方案2】:

这里

obj.replace();

你已经丢弃了返回值,std::string 您可以丢弃返回值。一般来说,这不是很好的风格,但你总是可以做到的。但实际的问题是你没有从replace 函数返回任何东西:

std::string myclass::replace()

    std::cout<<"I replace"<<std::endl;
    //... return statement is missing

解决方案:

std::string myclass::replace()

    std::cout<<"I replace"<<std::endl;
    return std::string();

【讨论】:

以上是关于使用字符串时的c ++初学者分段错误的主要内容,如果未能解决你的问题,请参考以下文章

C++ 合并排序分段错误?

C中scanf和字符串的分段错误

请解释为啥这个 C 代码给我一个分段错误?

使用 Tcl C API 的 Lib 可能由于错误的 refCount 使用而崩溃

在 C++ 索引程序中使用向量时出现分段错误 11

在 python 中使用命令行时出现语法错误