2015-02-13 2 views
0

Даже если я пишу это заявление,Есть ли способ вычислить размер заостренного вектора через sizeof()?

char *test= new char[35]; 

SizeOf (тест) всегда будет возвращать 4 (или другой номер в зависимости от системы), а не 35. Я полагаю, что это происходит потому, что размер указателя является строго физический «указывающий объект», а не объем памяти, зарезервированный для этого указателя. Правильно ли это?

Кроме того, есть ли способ получить объем памяти, зарезервированный для определенного указателя, используя sizeof()?

+0

Одним словом: Нету. –

+1

Да, это правильно, и нет, нет способа. Вы должны помнить, что вы выделили. Также (обязательно): используйте 'std :: vector' или' std :: string'. – Wintermute

+0

Да. Нет. 'Sizeof' - это свойство времени компиляции. Объем выделенной памяти - это время выполнения. Более того, в некоторых случаях даже реализация C++ может не иметь доступа к этой информации после распределения. –

ответ

5

Nope.

Указатели - это простые переменные (обычно реализуемые как целые адреса), которые могут указывать на другие объекты, не имеют отношения к sizeof. Не думайте о них как о чем-то «волшебном», что как-то тесно связано с тем, что они указывают. Указатели - это не более чем номер улицы.

Я несу это вверх из:

[...] размер указателя строго физическое «указывает объект» , а не объем памяти зарезервированный для этого указателя ,

В вашей строке кода:

  • Массив 35 char с выделяется в динамической памяти
  • адрес первого элемента в возвращаемый new
  • Вы держать этот адрес в test.

Обратите внимание, что любое понятие массива или его размер исчезло до второго шага. Указатель ничего не знает об этом. Вы знаете.

Если вы хотите получить размер массива, вам нужно будет отслеживать его самостоятельно в отдельной переменной или использовать класс, который сделает это для вас, а именно std::vector<char>.

4

Я предполагаю, что это связано с тем, что размер указателя является строго физическим «указывающим объектом», а не объемом памяти, зарезервированной для этого указателя. Правильно ли это?

Да, это правильно; вы принимаете указатель sizeof(). Указатель - это адрес в памяти; на 32-битных системах это будет 4 байта. 64-битных систем будет 8 байтов.

Кроме того, есть ли способ получить объем памяти, зарезервированный для определенного указателя, используя sizeof()?

sizeof() ничего не знает о том, на что указывает указатель; это расчет времени компиляции. Получение этого размера будет зависеть от того, как оно было выделено.

В общем, вы должны использовать std::vector<>. Чтобы получить размер std::vector<>, используйте std::vector<>::size().

+0

Да, вы можете получить объем памяти, зарезервированный для определенного указателя, используя 'sizeof'. Это не тот объем памяти, на который он указывает, и, особенно, не часть того, что вы действительно хотите получить через него. – Deduplicator

0

Как сказано в других ответах, с обычного указателя нет способа узнать объем памяти, который был зарезервирован в точке, где он указывает, потому что он все еще указывает на мусор.

Как только вы заполняете память C-String, вы можете получить длину с strlen(test), потому что она ищет конец строкового байта (0x0).

Лучшим решением было бы использовать массив:

char test[35]; 
szie_t size = sizeof(test); //< returns 35 
+0

Как вы собираетесь передавать размер в качестве аргумента шаблона, если вы * не знаете его во время компиляции? – Quentin

+0

@Quentin: Вы правы. Аргумент шаблона должен быть 'const'. Спасибо. Редактирование моего ответа. – JanCG

Смежные вопросы