Пожалуйста, смотрите на этот вопрос какого-то контекст: 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 ссылаться на правильное (стандартное) определение этих операторов?
Неужели [это] (http://stackoverflow.com/a/4163102/241631) исправить вашу проблему? Трудно поверить, что библиотека переопределяет ':: operator new', не делая то же самое для' :: operator delete'. – Praetorian
@Praetorian Не совсем, хотя это актуально. Здесь я не пытаюсь использовать Abaqus ODB API (пока). Я считаю, что Abaqus определил как «новый», так и «delete». В этом случае это скорее проблема связывания. – Derek
@Derek: Мне кажется, что Praetorian прав - вы не можете использовать 'new' или' delete', который является частью библиотеки Abaqus, пока вы не вызвали функцию init Abaqus. Поскольку стандартная библиотека связана после Abaqus, вы получите версию Abaqus, а не версию в режиме исполнения C. Который кажется довольно беспорядочным способом делать что-то, но эй, я не работаю для Abaqus, поэтому я не знаю, что они курили, пили или думали, когда они придумывали это решение - возможно, он исправляет некоторые другие проблемы, которые действительно трудно исправить каким-то другим способом. –