Можно ли узнать сколько выделено памяти в куче на указателе?
Проблема, про которую хорошо описана в коде.
#include <iostream>
using namespace std;
void example_func(int*& b)
{
//Допустим мне надо пройтись по всему массиву (ну отсортировать допустим)
for (size_t i = 0; i < /* размер массива. */; i++) //что то наподобие b.size() или sizeof(b)/sizeof(int)?
{
/*
...
*/
}
}
int main()
{
int n;
cin >> n;
int* a = new int[n];
example_func(a);
}
Конечно как решение можно в аргументы функции передавать еще и размер массива, но хочется сделать все более кратко.
Ответы (2 шт):
Автор решения: вася
→ Ссылка
Нельзя узнать.
Не забывайте освобождать выделенную память после
new[].Чтобы явно не передавать размер, можно сделать так:
#include <iostream>
#include <span>
using namespace std;
void example_func(span<int> b)
{
for (size_t i = 0; i < b.size(); i++)
{
b[i] = 42;
}
}
int main()
{
size_t n;
cin >> n;
int* a = new int[n];
example_func({a, n});
delete[] a;
}
Автор решения: AlexGlebe
→ Ссылка
Можно не передавать аргументом характеристики массива, а только его адрес. Создаёте структуру с характеристиками и сами данные. new и delete для нового массива использовать нельзя. Всё только рукоделием New и Del.
// g++-9 -Wall -Os arrsize.cpp
# include <cstddef>
# include <cstdlib>
template<class T>
class Array {
public :
operator T * ( void ) { return p ; }
operator T const * ( void ) const { return p ; }
size_t size ( ) const { return n ; }
static Array & New ( size_t ) ;
void Del ( ) ;
private :
size_t n ;
T p [ ] ;
} ;
template<class T>
Array<T> & Array<T> :: New ( size_t const s ) {
Array < T > & a = * (Array < T > *)
malloc ( sizeof(Array<T>)+sizeof(T[s]) ) ;
for ( size_t i = 0 ; i < s ; ++ i )
new ( & ( a . p [ i ] ) ) T ;
a . n = s ;
return a ; }
template<class T>
void Array<T> :: Del ( ) {
for ( size_t i = 0 ; i < n ; ++ i )
( p [ i ] ) . ~ T ( ) ;
free ( this ) ; }
#include <iostream>
using namespace std;
void example_func(Array < int > & b)
{
//Допустим мне надо пройтись по всему массиву (ну отсортировать допустим)
for (size_t i = 0; i < b.size(); i++)
{
b[i] = i ;
}
}
int main()
{
int n;
cin >> n;
Array<int> & a = Array < int > :: New (n);
example_func(a);
cout << "a["<<n/2<<"]="<<a[n/2]<<std::endl;
++(a[n/2]);
Array<int> const & b = a ;
cout << "b["<<n/2<<"]="<<b[n/2]<<std::endl;
a.Del();
}
Фактически это массив, но с дополнительной информацией. На любителя.