![]() |
1
8
听起来这可能是一个问题,即从一个堆中进行分配,然后尝试在另一个堆中进行删除。当从dll分配对象时,这可能是一个问题,因为dll有自己的堆。从你展示的代码来看,这似乎不是问题所在,但在简化过程中,可能丢失了一些东西?在过去,我看到这样的代码使用工厂函数和虚拟函数
|
![]() |
2
1
微软为他们的C运行时提供了源代码;你可以去看看是什么
和
来检验你关于
|
![]() |
3
1
谢谢你的回答和评论。 所有这些都是有用和相关的。
我发现了一个/MT和/MTd的“掩埋”实例,应该是/MD和/MDd, 加上其他设置中一些相关的不一致。 纠正这些错误之后, 现在不会抛出任何断言,代码的行为似乎是正确的。 以下是在执行时遇到崩溃或断言失败时要检查的一些内容:调用作用域和析构函数。 在所有配置中(尤其是在有问题的配置中): (此处*.vcproj路径相对于</VisualStudioProject/Configurations/Configuration/>)
有趣的是 标量 矢量 正在删除析构函数。 因此,这可能是一个'红鲱鱼'。 或许我还错过了其他一些微妙之处。 |
|
4
1
这种行为对于MSVC 9是特殊的,在MSVC 9中,导出类的delete操作符(具有虚拟析构函数)隐式生成并损坏为带有相关标志的vector dtor,其中1表示(标量),3表示(向量)。
此外,向量dtor似乎也执行错误,如果新的被分配到实现所在的模块之外的另一个模块中,然后通过引用计数被保存在静态变量中,该引用计数在进程关闭时执行delete this(这里向量dtor起作用)。 这与前面提到的堆问题“bshiels”相匹配,dtor在错误的堆上执行,代码在关闭时出现“无法读取该内存位置”或“访问冲突”的情况—此类问题似乎非常常见。 解决这个bug的唯一方法是禁止使用虚拟析构函数,并自己执行它,通过强制使用delete函数从基类中删除这个函数-尽管很愚蠢,但你还是模仿了虚拟dtor应该为你做的事情。然后执行标量dtor,在关闭时,模块之间共享的任何ref计数对象都可以以安全的方式实例化,因为堆总是正确地寻址到源模块。 要检查,如果您有这样的问题,只需禁止使用vector delete操作符。 |
![]() |
5
0
这不是问题所在。根据中的伪代码
Mismatching scalar and vector new and delete
,的
正如其他海报所指出的,您的实际问题是在一个堆上进行分配,而在另一个堆上进行删除。最清晰的解决方案是给类提供
|
![]() |
SRobertJames · 使用printf的gdb显示 1 年前 |
|
Subin · 在vscode中运行c时出错 1 年前 |
![]() |
Community wiki · 如何调试Python内存故障? 1 年前 |
![]() |
Kai · 有什么方法可以轻松优化VSCode中的锈迹? 2 年前 |
![]() |
Chris Brandon · 如何使节点在堆栈溢出时中断? 2 年前 |