我遇到了我抛出的异常类的一个非常奇怪的(至少对我而言)行为。我所做的是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 - 块,那将会创建。