Можно ли узнать сколько выделено памяти в куче на указателе?

Проблема, про которую хорошо описана в коде.

#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 шт):

Автор решения: вася
  1. Нельзя узнать.

  2. Не забывайте освобождать выделенную память после new[].

  3. Чтобы явно не передавать размер, можно сделать так:

#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();
}

Фактически это массив, но с дополнительной информацией. На любителя.

→ Ссылка