4

我有一个与 Abaqus 交互的后处理程序。该程序适用于 Abaqus 6.9 EF1。我想更新程序以使用 Abaqus 6.12。我没有让程序与更新的 API 一起工作的运气。

我已经更新了 Visual Studio 2010 中要链接的库列表。一切都正确构建和链接。当我运行程序时,我在点击之前收到以下消息main

错误信息

由于程序很大(> 120k 行),我决定回到基础。下面的简单程序运行良好,直到我调用delete. 一旦我打电话delete,我就会收到同样的错误信息。如果我不链接到 Abaqus 库,程序将完全运行。

#include <iostream>

int main( int argc, char* argv[] )
{
    std::cout << "Hello world" << std::endl;

    int *p;
    p = new int(3);
    std::cout << *p << std::endl;
    delete p;

    return 0;
}

澄清:

案例 1:未链接到 Abaqus 库。运行良好。

案例 2:链接到 Abaqus 库。抛出调试断言失败消息。

底线:我不明白链接但不使用他们的库是如何破坏简单程序的。

在我之前使用 Abaqus 的问题中,我确信他们已经创建了自己的newdelete操作符。可以new在调用标准版本的同时调用他们的版本delete吗?如果是这样,它是一种解决这些功能范围的方法吗?

4

1 回答 1

0

事实证明,Abaqus 定义了自己的operator newoperator delete全局命名空间中。因此,我在不知不觉中链接到他们的operator new.

但是,Visual Studio 链接到 Abaqus 定义operator new不是Abaqus 定义operator delete。相反,Visual Studio 链接到operator delete.

这些功能不能互换使用,所以我收到错误消息。但是,由于 Abaqus 将它们的operator newoperator delete函数放在全局命名空间中,我相信我无法控制链接哪个函数。


更新:以上只是部分正确。Abaqus 确实定义了它们自己的operator new,但它们没有定义匹配operator delete——至少在全局命名空间中。

因此,Visual Studio 无法链接到相应的 Abaqus operator delete,因为它不存在。

于 2013-06-25T00:00:37.657 回答