#c #memory
#c #память
Вопрос:
void OnReceived(std::shared_ptr<uint8_t> buffer, int len) {
.........
}
int main(){
std::vector<char> buffer(1000);
OnReceived((std::shared_ptr<uint8_t>)buffer.data(),rcvlen);
}
пытаюсь применить его, но не могу, не знаю почему!!!
Error 1 error C2664: 'std::tr1::_Ptr_base<_Ty>::_Reset0' : cannot convert parameter 1 from 'char *' to 'uint8_t *' c:program filesmicrosoft visual studio 10.0vcincludememory 1705
итак, как я могу его преобразовать?
Комментарии:
1. Возможно
(std::shared_ptr<uint8_t>)(uint8_t*)buffer.data()
?2. Смысл типов заключается в безопасности, цель которой вы нарушаете, пытаясь в любом случае привести. Вы должны попытаться понять роль каждого типа и решить ее таким образом, а не пытаться игнорировать их.
Ответ №1:
Вы действительно не хотите этого делать. Помимо того факта, что char и uint8_t могут быть разными типами, даже если вы принудительно скомпилируете код, ваш буфер будет освобожден дважды, что, вероятно, приведет к сбою вашей программы. Просто измените onReceived, чтобы принять необработанный указатель.
Комментарии:
1. 1 — назначение интеллектуального указателя — управлять временем жизни объекта. Если функция не может повлиять на время жизни объекта, не имеет значения, передаете ли вы ей интеллектуальный указатель или немой, с немой проще работать.
Ответ №2:
Помимо несоответствия типов, вы не хотите этого делать. Это почти приведет к сбою, когда и векторный деструктор, и shared_ptr освободят одну и ту же память. Вам следует рассмотреть boost::shared_array
или общий указатель на весь вектор ( shared_ptr<std::vector>
) вместо того, что вы делаете сейчас. Или, как предлагает Игорь, OnReceived
можно было бы изменить, чтобы принять необработанный указатель, если для этого не требуется совместное владение буфером.
Ответ №3:
uint8_t
является unsigned char
поэтому вам нужно либо изменить тип буфера, либо переинтерпретировать_каст где-нибудь в строке.
Ответ №4:
buffer.data() вернет символ * . Вы пытаетесь преобразовать это в std::shared_ptr — другими словами, создать из него shared_ptr. В своей реализации он пытается присвоить указатель, но не может, поскольку вы передаете несовместимый тип указателя.
Попробуйте привести его к соответствующему типу перед передачей, например:
OnReceived((std::shared_ptr<uint8_t>)(uint8_t *)buffer.data(),rcvlen);
или, возможно, лучшее решение, преобразовать ваш std::vector в вектор uint8_t.