2013-06-24 7 views
2

Пожалуйста, смотрите на этот вопрос какого-то контекст: Linking unreferenced libraries breaks my programРазрешающих Стандартные новые/удалить оператор

У меня есть следующие программы:

#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; 
} 

Он работает отлично, пока я не ссылки на сторонние библиотеки. Когда я связываюсь с библиотеками Abaqus, которые мне понадобятся в гораздо более крупной программе, вышеуказанная программа вылетает при попытке запустить delete p;. Используя Dependency Walker, я обнаружил, что вызов operator new связан с определением operator new, предоставленным Abaqus. Однако вызов operator delete связан со стандартным определением.

Я заменил new/delete::new/::delete и получил тот же результат.

Есть ли способ разрешить стандартные операторы new/delete? В качестве альтернативы, могу ли я заставить Visual Studio ссылаться на правильное (стандартное) определение этих операторов?

+1

Неужели [это] (http://stackoverflow.com/a/4163102/241631) исправить вашу проблему? Трудно поверить, что библиотека переопределяет ':: operator new', не делая то же самое для' :: operator delete'. – Praetorian

+0

@Praetorian Не совсем, хотя это актуально. Здесь я не пытаюсь использовать Abaqus ODB API (пока). Я считаю, что Abaqus определил как «новый», так и «delete». В этом случае это скорее проблема связывания. – Derek

+0

@Derek: Мне кажется, что Praetorian прав - вы не можете использовать 'new' или' delete', который является частью библиотеки Abaqus, пока вы не вызвали функцию init Abaqus. Поскольку стандартная библиотека связана после Abaqus, вы получите версию Abaqus, а не версию в режиме исполнения C. Который кажется довольно беспорядочным способом делать что-то, но эй, я не работаю для Abaqus, поэтому я не знаю, что они курили, пили или думали, когда они придумывали это решение - возможно, он исправляет некоторые другие проблемы, которые действительно трудно исправить каким-то другим способом. –

ответ

0

Задание опции компоновщика "/DEFAULTLIB:MSVCRT.LIB" заставляет программу успешно выполнить.

+0

Хотя, Dependency Walker все еще показывает, что файл Abaqus .dll, содержащий их определение 'operator new', связан. – Derek