Следующий код:станд :: вектор использования станд :: shared_ptr
class Something
{
public:
~Something()
{
}
};
int main()
{
Something* s = new Something[1]; // raw pointer received from C api
std::shared_ptr<Something> p = std::shared_ptr<Something>(s);
std::vector<std::shared_ptr<Something>> v(&p,&p+1);
return 0;
}
дает следующее сообщение об ошибке в VS Express, 2010:
---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp
Line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
Удалить деструктор от чего-то и ошибка исчезает, Почему я получаю эту ошибку?
Update:
Позже у меня будет что-то вроде:
Something* s = new Something[100];
и отдельные разделяемые указатели будут розданы другим объектам
Я мыслил в терминах: что-то * s = новый Something [ 2]; delete s; delete (s + 1); С каждым общим указателем в векторном вызове delete (s + n). Но это, разумеется, неверно. Как может выглядеть судья? s в моем исходном сообщении может указывать на большой массив, а не на массив только 1. – Baz
Что касается делетера, следует ли мне пройти через вектор и проверить счетчик использования и вызвать delete [], когда он достигнет нуля? – Baz
@Baz no, вектор-деструктор автоматически вызывает вызовы деструкторов объектов, которые содержат. – ForEveR