我一直吹嘘我的一个朋友关于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;来自。发生了什么事?!
答案 0 :(得分:4)
当构造函数超出范围时,errorText
不再指向有效数据,因此当您调用what()
(它调用未定义的行为)时,所有投注都会关闭。最简单的解决方法是从std::runtime_error
派生,因为它保留了std::string
(或等效的),它在异常的生命周期内有效。
答案 1 :(得分:1)
问题是这个
errorString = errorText.str().c_str();
errorText是构造函数的本地对象,它超出了作用域并释放了它用于c_str()的内存。
尝试用char errorString[SomeLimit];
替换errorString并使用基本字符串操作写入它。对于异常处理程序,使用字符串流有点过于复杂。