none
C++ - как выделить память для массива в функции? RRS feed

  • Вопрос


  • Visual Studio 2012, консольное приложение. Хотел бы выделение памяти для различных типов данных выделить в функцию (в реальной программе выделяется память для char, short, float, double, complex). Попробовал тестовый пример:

    template <class X> void get_mem(X arr[], long int num_elem)
    {
      try 
      {
        arr = new X [num_elem];
      }
      catch(bad_alloc xa)
      {
        mes_error("Не удалось выделить память!");
      }
    }
    
    int main()
    {
      setlocale(LC_ALL, "Russian");
      long int num = 1000;
      char* data;
      get_mem(data, num); 
      //try 
      //{
      //  data = new char [num];
      //}
      //catch(bad_alloc xa)
      //{
      //  mes_error("Не удалось выделить память!");
      //}
      delete [] data;
      cin.get();
      return(EXIT_SUCCESS);
    } 

    Получил ошибку: "Run-Time Check Failure #3 - The variable 'data' is being used without being initialized.".
    Источник ошибки ясен, однако возник вопрос: можно ли как-то исправить код, чтобы все-таки можно было для объявленного массива выделить память в функции? Очень уж не хочется при выделении памяти каждого массива использовать 8 строчек кода (закоментированы в main). Проект прилагаю.


    Alex

    18 сентября 2014 г. 14:49

Ответы

  • Сделайте так:

    template <class X> void get_mem(X **arr, long int num_elem)
    {
      try 
      {
        *arr = new X [num_elem];
      }
      catch(bad_alloc xa)
      {
        mes_error("Не удалось выделить память!");
      }
    }
    
    int main()
    {
      setlocale(LC_ALL, "Russian");
      long int num = 1000;
      char* data;
      get_mem(&data, num); 
      //try 
      //{
      //  data = new char [num];
      //}
      //catch(bad_alloc xa)
      //{
      //  mes_error("Не удалось выделить память!");
      //}
      delete [] data;
      cin.get();
      return(EXIT_SUCCESS);
    }

    Шаблон функции у вас принимал копию указателя data, поэтому его изменение в шаблоне не влияло на значение переменной в main. Параметры типа вход-выход должны передаваться по адресу (или по ссылке), но не по значению.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа tumanovalex 19 сентября 2014 г. 12:46
    19 сентября 2014 г. 9:02
  • Внимательнее смотрите код, есть изменения и в main

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа tumanovalex 19 сентября 2014 г. 12:46
    19 сентября 2014 г. 12:26

Все ответы

  • Проект по ссылке https://yadi.sk/d/fPRQE-IObYJxp


    Alex

    18 сентября 2014 г. 14:57
  • Для начала, имеет смысл устранить утечку памяти в функции get_mem.
    18 сентября 2014 г. 17:12
  • Не понял. У привел тестовый пример, в программе передаю в функцию указатель, выделяю в функции память, далее предполагаю использовать в расчетах data. Что вы имеете ввиду под утечкой памяти?

    Alex

    19 сентября 2014 г. 6:12
  • Сделайте так:

    template <class X> void get_mem(X **arr, long int num_elem)
    {
      try 
      {
        *arr = new X [num_elem];
      }
      catch(bad_alloc xa)
      {
        mes_error("Не удалось выделить память!");
      }
    }
    
    int main()
    {
      setlocale(LC_ALL, "Russian");
      long int num = 1000;
      char* data;
      get_mem(&data, num); 
      //try 
      //{
      //  data = new char [num];
      //}
      //catch(bad_alloc xa)
      //{
      //  mes_error("Не удалось выделить память!");
      //}
      delete [] data;
      cin.get();
      return(EXIT_SUCCESS);
    }

    Шаблон функции у вас принимал копию указателя data, поэтому его изменение в шаблоне не влияло на значение переменной в main. Параметры типа вход-выход должны передаваться по адресу (или по ссылке), но не по значению.


    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа tumanovalex 19 сентября 2014 г. 12:46
    19 сентября 2014 г. 9:02
  • По Вашему варианту получил 2 ошибки:

    Error 1 error C2784: 'void get_mem(X **,long)' : could not deduce template argument for 'X **' from 'char *' c:\myprogramming\testcpp\testcpp.cpp 49 1 TestCpp

     2 IntelliSense: no instance of function template "get_mem" matches the argument list
                argument types are: (char *, long) c:\MyProgramming\TestCpp\TestCpp.cpp 49 3 TestCpp


    Alex

    19 сентября 2014 г. 12:24
  • Внимательнее смотрите код, есть изменения и в main

    Если сообщение помогло Вам, пожалуйста, не забудьте отметить его как ответ данной темы. Удачи в программировании!

    • Помечено в качестве ответа tumanovalex 19 сентября 2014 г. 12:46
    19 сентября 2014 г. 12:26
  • Спасибо, исправил main и все заработало.


    Alex

    19 сентября 2014 г. 12:46