gpt4 book ai didi

c++ - 在 C++ 代码中使用 new/delete 而不是 malloc/free 时崩溃

转载 作者:太空狗 更新时间:2023-10-29 23:42:39 28 4
gpt4 key购买 nike

我的开发环境是[Windows 7; Visual Studio 2010; x86].

我有一个很久以前为服务器 2003 构建的 dll。当我在我的项目中使用它并按照新建/删除顺序使用类时,应用程序在删除调用期间崩溃。即使在新建和删除之间没有任何其他调用,我也验证了相同的内容。当我用 malloc/free 替换 new/delete 时,没有崩溃。如果我只是在没有 new 的情况下声明一个类的实例,则在退出作用域时不会发生崩溃。

知道可能出了什么问题吗?这是我们公司的内部图书馆,所以我无法命名它和其他类似的东西。

附加信息:首先要使用这个库,我必须关闭 VS 功能“将 wchar_t 视为内置类型”。

代码简单

{
CLogger * myLog = new CLogger();
delete myLog; // Crash happens here
}

{ // No crash here
CLogger MyLog;
}

{
CLogger * myLog = (CLogger *) malloc (sizeof(CLogger));
free (myLog); // This does not crash.
}

这是专有库,我不能发布构造函数和析构函数。

最佳答案

delete 不仅仅是释放内存:它还调用了之前的析构函数。这意味着那个类的析构函数中一定有什么不好的东西。

如果析构函数中出现未捕获的异常,则整个进程退出 (*)。正如下面的评论(感谢您的良好反馈),这是过度简化的,这里是一个很好的链接,可以获取更多详细信息: throwing exceptions out of a destructor

我建议你放一个

try {} catch (std::exception& e){} catch(...) {}

在析构函数中注销正在发生的事情,或者更好地让它通过调试器,并选择在抛出异常的地方停止。

然后应该很容易识别不同之处。只是我的猜测,可能是某些注册表访问权限或文件访问权限,从服务器 2003 到 Windows 7 引入了一些更改。

关于c++ - 在 C++ 代码中使用 new/delete 而不是 malloc/free 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3071538/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com