C ++ CLI и проблема с памятью в C # [дубликат]

1) Если методы находятся в одном файле js

, определите все методы как свойства обработчика:

var Handler={};

Handler.application_run = function (name) {
console.log(name)
}

Теперь назовите его следующим образом:

var somefunc = "application_run";
Handler[somefunc]('jerry codes');

Выход: коды jerry


2) Если вы хотите сохранить методы в другом js-файле

//    Handler.js
module.exports={
    //  name_exported : internal_name
    application_run = function (name) {
console.log(name)
}
}

Использовать метод, определенный в Handler.js в different.js :

//    different.js
var methods = require('./Handler.js')   // path to Handler.js
methods['application_run']('jerry codes')

Выход: коды jerry

11
задан Bo Persson 10 February 2016 в 09:31
поделиться

2 ответа

Поскольку это DLL, проблема может заключаться в разных кучах, используемых для распределения и освобождения (попробуйте построить библиотеку статически и проверить, будет ли это работать).

Проблема в том, что DLL и шаблоны не согласны вместе очень хорошо. В общем, в зависимости от привязки среды выполнения MSVC это может быть проблемой, если память выделена в исполняемом файле и освобождена в DLL и наоборот (потому что у них могут быть разные кучи). И это может произойти с шаблонами очень легко, например: вы push_back () в вектор внутри removeWhiteSpaces () в DLL, поэтому векторная память выделяется внутри DLL. Затем вы используете выходной вектор в исполняемом файле, и как только он выходит из области видимости, он освобождается, но внутри исполняемого файла, чья куча ничего не знает о куче, из которой она была выделена. Bang, вы мертвы.

Это можно обойти, если и DLL, и исполняемый файл используют одну и ту же кучу. Чтобы обеспечить это, DLL и исполняемый файл должны использовать динамическую среду выполнения MSVC, поэтому убедитесь, что обе они связаны с динамической динамикой, а не статически. В частности, exe должен быть скомпилирован и связан с / MD [d] и библиотекой с / LD [d] или / MD [d], а также с / MT [d]. Обратите внимание, что впоследствии компьютеру, на котором будет запущено приложение, потребуется запустить исполняемую библиотеку MSVC (например, путем установки «Распространяемого на Visual C ++» для конкретной версии MSVC).

Вы могли бы получить эту работу даже с / MT, но это сложнее - вам нужно будет предоставить некоторый интерфейс, который позволит также освободить объекты, выделенные в DLL. Например, что-то вроде:

__declspec(dllexport) void deallocVector(std::vector<std::string> &x);

void deallocVector(std::vector<std::string> &x) {
    std::vector<std::string> tmp;
    v.swap(tmp);
}

(однако это не очень хорошо работает во всех случаях, так как это нужно вызывать явно, поэтому он не будет называться, например, в случае исключения - для правильного решения , вам нужно будет предоставить некоторый интерфейс из DLL, который будет охватывать вектор под капотом и позаботится о правильном RAII)


EDIT: окончательное решение было фактически состоять в том, чтобы все проектов (exe, dll и весь проект googleTest), встроенных в многопоточную Debug DLL (/ MDd) (по умолчанию проекты GoogleTest встроены в многопоточную отладку (/ MTd))

23
ответ дан MickyD 16 August 2018 в 01:10
поделиться
  • 1
    Я собираюсь попробовать это, но, к сожалению, в конце концов мне нужно найти способ заставить его работать как DLL, так как мой руководитель хочет, чтобы это было так – Rok 10 February 2016 в 11:01
  • 2
    Обновленный ответ, вам в основном нужно связать с динамическим временем выполнения, чтобы избежать подобных проблем. – axalis 10 February 2016 в 11:03
  • 3
    поэтому, если я правильно понимаю, мне нужно установить библиотеку времени исполнения exe в / MD и одну из DLL в / LD правильно? Если это так, я не могу сделать это для DLL, потому что параметр / LD не предоставляется мне – Rok 10 February 2016 в 11:13
  • 4
    Hum ... Я думаю, что вы можете использовать / MD для библиотеки, а / LD просто предоставляет некоторые дополнительные автоматические макроопределения AFAIK (возможно, он был удален в новых версиях, я тоже не вижу его в MSVC 2013) – axalis 10 February 2016 в 11:25
  • 5
    Хорошо построение exe in / MD приводит к тому, что я получаю кучу ошибок компоновщика (я до сих пор строил его в / MT, и это было правильно) – Rok 10 February 2016 в 11:29

У меня была аналогичная проблема, и оказалось, что мой проект unittest был настроен на другую библиотеку времени исполнения кода, поэтому, установив ее так же, как проект DLL, тогда исключение кучи

1
ответ дан serup 16 August 2018 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: