длина динамического массива
знаю, что с помощью стандартных способов это невозможно (в c++), но, например, в Java это можно сделать с помощью метода length, а на c++ как это можно реализовать?
Следует учесть, что массивы могут быть и двумерными...
Заранее благодарен за любую помощь!
Код:
size_t _msize(void *memblock);
но только, если память была выделена calloc, malloc или realloc.
Что-то вроде GetProcessHeaps --> HeapWalk. И смотришь для каждого блока, на случай если он выделен под данный массив.
НО... _msize возвращает значение только для памяти выделенной с помощью malloc(), а как быть с оператором new?
Код:
char * s = new char[128];
strcpy(s, "hello, world!");
cout << _msize(s) << endl;
strcpy(s, "hello, world!");
cout << _msize(s) << endl;
выводит 128. Коллеги, можно ли (поддерживается ли это системой) использовать new и _msize вместе?
В любом случае - это нелегитимное решение. Зачем тебе узнавать размер памяти по указателю - длину надо хранить всегда.
Цитата: ШпиЁн
...
... _msize возвращает значение только для памяти выделенной с помощью malloc(), а как быть с оператором new?
... _msize возвращает значение только для памяти выделенной с помощью malloc(), а как быть с оператором new?
Насколько я знаю, оператор new работает через malloc, который, в свою очередь через HeapAlloc. Аналогичная схема и с delete: delete -> free -> HeapFree.
Если эта схема правильная, то использование _msize - допустимо.
ЗЫ : А если код такой
Код:
char* p = new char[N]; // массив байт, верна ? ;)
// и если в массиве p заведомо нет нулей, то попросту
unsigned length = strlen(p);
// и если в массиве p заведомо нет нулей, то попросту
unsigned length = strlen(p);
Цитата: _io_lock
...
Код:
char* p = new char[N]; // массив байт, верна ? ;)
// и если в массиве p заведомо нет нулей, то попросту
unsigned length = strlen(p);
// и если в массиве p заведомо нет нулей, то попросту
unsigned length = strlen(p);
1. Речь здесь идет совсем о другом.
2. strlen - функция, для работы со строками в стиле С (ASCII(Z)). Название темы внимательно прочитай. :)
Если сам создал массив, значит должен и длину знать.
Если мучает склероз, сохрани длину в соотв. переменной, рядом с массивом.
Какие проблемы? В чем сложность? Зачем делать простые вещи через задние проходы?
Цитата: Green
Если мучает склероз, сохрани длину в соотв. переменной, рядом с массивом.
Тут кстати, поблизости есть тема, о пользе контейнеров:)
Вот я и решил что проще узнавать как-то размер блока памяти по указателю на него, чем хранить где-то количество элементов в таких массивах.
Вариант с контейнерами хорош конечно, но мне нужно быстродействие.
Всем спасибо за советы, вопрос исчерпан.