我遇到了我抛出的异常类的一个非常奇怪的行为(至少对我来说)。我要做的是通过new
在异常类的构造函数中为字符串分配内存,并用字符填充它。到目前为止,一切都很好。在调试代码时,我可以在Visual Studio中看到指针实际上具有正确的内容。
现在,奇怪的事情发生了。我的下一个断点是在catch-块中,异常在构造后传递到该块-在这里,我可以在调试器中看到异常对象中包含的字符串的内容已严重损坏。即使地址完全没有改变!因此,似乎字符串的内容被破坏了。
因此,我在异常析构函数中放置了一个断点,实际上,在进入catch-块之前调用了该断点。因为我学会了通过引用catch块来传递异常,这使我非常困惑。但是,如果在我可以访问动态创建的数据之前调用析构函数,那有什么好处呢?
我构建了一个最小的示例来显示我所处的情况:
#include <iostream>
#include <cstring>
class test_exception {
public:
test_exception();
~test_exception() {
delete[] _msg;
}
// Getter Functions
char* errorMessage() const {
return _msg;
}
private:
char* _msg;
};
test_exception::test_exception()
{
_msg = new char[22];
strcpy(_msg, "This is a test string");
}
int main(int argc, char* argv[])
{
try {
throw test_exception();
} catch (const test_exception& err) {
std::cout << err.errorMessage() << std::endl;
}
std::cin.get();
return 0;
}
如果有人可以告诉我这是否是奇怪的MS行为,或者如果我误解了应该如何使用try-catch-块,那将是一个创造。
最佳答案
抛出异常时将其复制(或在C++ 11中移动)。引用C++ 11,§15.1/ 3:
由于test_exception
违反了rule-of-three(或对于C++ 11,rule-of-five),因此在您输入test_exception::_msg
块时,catch
已被删除。
关于c++ - char指针的内容在传递给catch块时似乎被删除了,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10109971/