C ++异常 - 什么不能正常运行

时间:2013-11-19 00:11:13

标签: c++ c++11

我一直吹嘘我的一个朋友关于C ++(范围和RAII和静态打字ftw)(如果这是我而不是问我会感到尴尬:P)但是我和我一样看着它我很困惑,因为出了什么问题。我希望你们能帮忙。她来自Java,因此来自CamcelCase

ListIndexOutOfBoundsException.h

#ifndef LISTINDEXOUTOFBOUNDSEXCEPTION_H_
#define LISTINDEXOUTOFBOUNDSEXCEPTION_H_
#include <exception>
namespace Structures {
class ListIndexOutOfBoundsException: public ::std::exception {
public:
    ListIndexOutOfBoundsException(int index, int length);
    virtual const char* what() const noexcept;
    virtual ~ListIndexOutOfBoundsException() noexcept;
private:
    const char* errorString;
};
}



#endif /* LISTINDEXOUTOFBOUNDSEXCEPTION_H_ */

ListIndexOutOfBoundsException.cpp

#include "ListIndexOutOfBoundsException.h"
#include <string>
#include <sstream>
namespace Structures {
using ::std::stringstream;

ListIndexOutOfBoundsException::ListIndexOutOfBoundsException(int index,int length) {
    stringstream errorText("List index (");
    errorText<<index<<") out of bounds! (list length: "<<length<<")";
    errorString = errorText.str().c_str();
}

const char* ListIndexOutOfBoundsException::what() const noexcept {
    return errorString;
}

ListIndexOutOfBoundsException::~ListIndexOutOfBoundsException() noexcept {
    delete errorString;
}


}

抛出时会发生这种情况:

terminate called after throwing an instance of 
'Structures::ListIndexOutOfBoundsException'
 what():  OfBoundsException

我无法解决&#34; OfBoundsException&#34;来自。发生了什么事?!

2 个答案:

答案 0 :(得分:4)

当构造函数超出范围时,errorText不再指向有效数据,因此当您调用what()(它调用未定义的行为)时,所有投注都会关闭。最简单的解决方法是从std::runtime_error派生,因为它保留了std::string(或等效的),它在异常的生命周期内有效。

答案 1 :(得分:1)

问题是这个

errorString = errorText.str().c_str();

errorText是构造函数的本地对象,它超出了作用域并释放了它用于c_str()的内存。

尝试用char errorString[SomeLimit];替换errorString并使用基本字符串操作写入它。对于异常处理程序,使用字符串流有点过于复杂。