Я работаю с SWIG, чтобы обернуть некоторый код C++ в Python. Функция С++, которую я оборачиваю, определяется как:
template <typename T>
void getData(const std::string& fileName, T*& data);
Данные передаются как ссылка на указатель, потому что данные в файле могут быть либо того же типа, что и указатель, либо другого типа. В первом случае мы просто заменяем указатель на тот, который указывает на данные файла, во втором случае мы используем std::copy для приведения каждого значения к запрошенному типу.
Теперь мы подошли к моему вопросу, упаковка SWIG дала мне следующую функцию:
void wrap_getData(const std::string& fileName, T* data) {
getData(fileName, data);
}
И это называется использованием:
unsigned char* data = new unsigned char[dataSizeInFile]
wrap_getData(fileName, data)
Поскольку тип данных в файле также является беззнаковым символом, обычно он просто меняет адрес памяти указателя (если бы я использовал getData). Однако сейчас я бы ожидал, что этого не произойдет, но это происходит.
Например, исходный адрес памяти указателя (&ptr) = 0x000000000c840070, тогда внутри функции wrap_getData адрес памяти указателя данных (&ptr) равен 0x00000000002393e8, что, как и ожидалось, отличается, поскольку указатель копируется. Но теперь, когда я передаю этот указатель по ссылке фактической функции getData, адрес памяти (&ptr) снова равен 0x000000000c840070, чего я не ожидал, я ожидал, что он останется 0x00000000002393e8, так как копия передается по ссылке. Почему это происходит?
&ptr
, а адрес, на который указывает указатель, означает простоptr
. Прямо сейчас действительно неясно, что вы имеете в виду, когда, и какое из двух значений не соответствует вашим ожиданиям. - person aruisdante   schedule 23.03.2015