捕获异常并调用 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();
}
}
在我的程序中,调用
时出现分段错误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();
}
}