Может ли std :: vector, созданный в управляемом C ++ / cli, в (управляемых) ячейках стека изменить память? - PullRequest
3 голосов
/ 21 октября 2010

Если в C ++ / cli я пишу

ref class test {
    void method() {<
       std::vector<float> my_stack_vector;
       native_function_call( & my_stack_vector );
    }    
};

Может ли местоположение my_stack_vector измениться после его создания? Я знаю, что если бы он жил в базовом собственном стеке, он бы не изменился, но с дополнительным уровнем абстракции .Net создает, я не знаю, подвержен ли он перемещению в памяти.

Что более важно, как я могу проверить это для себя, например, что я буду искать, используя ILDASM или в собственной разборке после того, как он будет скомпилирован в собственный код во время выполнения или где-то еще, чтобы иметь возможность самостоятельно отвечать на такие вопросы в будущем?

1 Ответ

3 голосов
/ 21 октября 2010

Нет, вы в порядке с этим кодом. Сборщик мусора перемещает только управляемые объекты (класс ref), размещенные в куче GC. Он не связывается со стеком или скомпилированным кодом JIT.

Вам не нужно беспокоиться о появлении подобных ошибок, компилятор всегда предупреждает вас об этом. Попробуйте сделать вектор членом класса, например. Теперь это будет проблемой, GC перемещает объект типа "test".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...