捕获异常并调用 cout 后的 C++ 分段错误

C++ Segmentation fault after catching exception and calling cout

在我的程序中,调用

时出现分段错误

cout << ( ball(1,0,0) ).getName();

我打电话时出于测试目的
( ball(1,0,0) ).getName();

我得到了预期的异常,程序没有崩溃。

这里可能有什么问题?我尝试过重载 ostream,但它似乎没有用。该程序的相关部分是:

球& Field::operator()(int x, int y, int z){

try{
    if (arr[x][y][z]==1){ // When it's 1, there is a ball in that coord 
        return search(root,x,y,z); // Return ball instance
    }else{

        throw ballException(); // 'Error: Ball not found'
    }
}catch(std::exception &e){
    std::cout << e.what() << std::endl;

}

}

常量字符串& Ball::getName() 常量{

                try{
                    return this->name;

                }catch(std::exception & e){

                }


}

Ball::Ball(const string& name, const string& type, int size){
this->name =name;
this->type = type;
this->size= size;

}
球异常是:

 class ballException: public exception {
virtual const char* what() const throw() {
        return "Error: No Ball in the coordinates!";
}

};

当您捕捉到异常时,foo( 0 ) 是否仍然是 return 可以调用 getName() 的对象?

要使用这种语法,您通常必须 return 一个空的(通常是静态的)对象,在该对象上实现了 getName(),或者在退出函数之前确保对象的状态。下面大体思路:

#include <exception>
#include <iostream>
#include <string>

class SomeObject
{
public:
    SomeObject(const std::string& name):_name(name)
    {
    }
    const std::string&  getName() const
    {
        return _name;
    };

    static const SomeObject& getEmpty()
    {
        static SomeObject _empty("");
        return _empty;
    };
private:

    std::string _name;

};


const SomeObject *function( bool throw_exception)
{
    SomeObject * NeverConstructed = 0;
    try {
        if ( throw_exception )
            throw std::runtime_error("oops");
    } catch ( const std::runtime_error& e) {
        std::cout << e.what() << std::endl;
        return &SomeObject::getEmpty();
    }

    return NeverConstructed; // will crash
}

int main(){

    std::cout << (function( true ))->getName() << std::endl;
    return 0;
}

当你捕获异常时你没有返回任何东西:

Ball& Field::operator()(int x, int y, int z){
    try{
        if (arr[x][y][z]==1){ // When it's 1, there is a ball in that coord 
            return search(root,x,y,z); // Return ball instance
        }else{
            throw ballException(); // 'Error: Ball not found'
        }
    }catch(std::exception &e){
        std::cout << e.what() << std::endl;
    }
    // Nothing is returned.
}

除非search也抛出异常,异常处理完全没有意义,代码等同于

Ball& Field::operator()(int x, int y, int z){
    if (arr[x][y][z]==1){ // When it's 1, there is a ball in that coord 
        return search(root,x,y,z); // Return ball instance
    }
    // Returns nothing
}

对该不存在的对象调用 getName 可能有效也可能无效 – 它未定义。
(与仅引用它相比,当您尝试打印不存在的名称时更有可能崩溃。)

您可能希望在调用代码中处理异常,而不是为该代码提供一个不存在的对象:

Ball& Field::operator()(int x, int y, int z){
    if (arr[x][y][z]==1){
        return search(root,x,y,z);
    }else{
        throw ballException();
    }
}