Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Правильность кода

6.5K
07 марта 2006 года
viTTas
20 / / 02.04.2005
Хотелось бы услышать мнения о правильности использования new в этой функции:
Код:
char * merge (char * string_1, char * string_2) {
  int length_1 = strlen (string_1);
  int length_2 = strlen (string_2);
  int length = length_1 + length_2;
  [color=red]char * result = new char [length];[/color]
  for (int number = 0; number < length_1; number ++) {
    result [number] = string_1 [number];
  }
  for (number = 0; number < length_2; number ++) {
    result [length_1 + number] = string_2 [number];
  }
  result [length] = '\0';
  return (result);
}


У меня такие опреаторы new практически во всех функциях управлениями строк, где происходит изменение длины строки, это верно?
7.9K
07 марта 2006 года
uki_
122 / / 26.01.2006
нужно выделить память и под \0 символ.
324
07 марта 2006 года
AndreySar
532 / / 01.08.2004
Цитата:
Originally posted by viTTas
Хотелось бы услышать мнения о правильности использования new в этой функции:
Код:
char * merge (char * string_1, char * string_2) {
  int length_1 = strlen (string_1);
  int length_2 = strlen (string_2);
  int length = length_1 + length_2;
  [color=red]char * result = new char [length];[/color]
  for (int number = 0; number < length_1; number ++) {
    result [number] = string_1 [number];
  }
  for (number = 0; number < length_2; number ++) {
    result [length_1 + number] = string_2 [number];
  }
  result [length] = '\0';
  return (result);
}


У меня такие опреаторы new практически во всех функциях управлениями строк, где происходит изменение длины строки, это верно?



Если ты выделяешь память в функции, то ты ее там и должен освободить.

6.5K
07 марта 2006 года
viTTas
20 / / 02.04.2005
Цитата:
Originally posted by uki_
нужно выделить память и под \0 символ.

Значит не new char [length], а new char [length + 1].

У меня такие опреаторы new практически во всех функциях управлениями строк, где происходит изменение длины строки, это правильно?

Цитата:
Если ты выделяешь память в функции, то ты ее там и должен освободить.

Не могу, компилятор ругается когда видит delete [] строка.

534
07 марта 2006 года
HarryAxe
448 / / 19.01.2006
Цитата:
Originally posted by viTTas
Значит не new char [length], а new char [length + 1].
Не могу, компилятор ругается когда видит delete [] строка.

Ну так удалять-то ты должен уже вне этой функции, ты же возвращаешь указатель на новую строку.

505
07 марта 2006 года
vAC
343 / / 28.02.2006
Цитата:
Originally posted by viTTas
Хотелось бы услышать мнения о правильности использования new в этой функции:
Код:
char * merge (char * string_1, char * string_2) {
  int length_1 = strlen (string_1);
  int length_2 = strlen (string_2);
  int length = length_1 + length_2;
  [color=red]char * result = new char [length];[/color]
  for (int number = 0; number < length_1; number ++) {
    result [number] = string_1 [number];
  }
  for (number = 0; number < length_2; number ++) {
    result [length_1 + number] = string_2 [number];
  }
  result [length] = '\0';
  return (result);
}


У меня такие опреаторы new практически во всех функциях управлениями строк, где происходит изменение длины строки, это верно?



НИКОГДА не надо делать ТАКОГО. Выделять - в одной функции, удалять - в другой. Потом ошибки будешь искать сутками. Передавай в эту функцию указатель на уже выделенный блок и его размер. Если размер недостаточен,то обрезай вывод. А что будет представлять этот указатель-уже не важно. Будь то указатель на динамическую память или на массив, что хошь, то и передавай, только не забывай учитывать размер. Система всегда должна быть замкнутой...

7.9K
07 марта 2006 года
uki_
122 / / 26.01.2006
Цитата:
Originally posted by vAC
НИКОГДА не надо делать ТАКОГО. Выделять - в одной функции, удалять - в другой. Потом ошибки будешь искать сутками. Передавай в эту функцию указатель на уже выделенный блок и его размер. Если размер недостаточен,то обрезай вывод. А что будет представлять этот указатель-уже не важно. Будь то указатель на динамическую память или на массив, что хошь, то и передавай, только не забывай учитывать размер. Система всегда должна быть замкнутой...

Для того, чтоб выделить память, сперва нужно определить его размер. В данном случае это 3 команды и тогда будем иметь

 
Код:
int length_1 = strlen (string_1);
int length_2 = strlen (string_2);
int length = length_1 + length_2;
char * result = new char [length];
merge(result, string_1, string_2)
...
Пусть merge вызывается из 10 мест программы. Это +40 команд. И главное, если изменится алгоритм вычисления размера, тогда этот алгоритм нужно будет изменить во всех 10 местах.
351
07 марта 2006 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by uki_
Для того, чтоб выделить память, сперва нужно определить его размер. В данном случае это 3 команды и тогда будем иметь
 
Код:
int length_1 = strlen (string_1);
int length_2 = strlen (string_2);
int length = length_1 + length_2;
char * result = new char [length];
merge(result, string_1, string_2)
...
Пусть merge вызывается из 10 мест программы. Это +40 команд. И главное, если изменится алгоритм вычисления размера, тогда этот алгоритм нужно будет изменить во всех 10 местах.


Наиболее правильным вариантом бы было :

 
Код:
merge( std::string str1,
       std::string str2,
       std::string& result )

таким образом мы создаем и удаляем строку в вызывающей функции, а память для нее выделяем в функции merge ( посредством задания значения переменной result ). Затем при удалении переменной result в вызывающем коде освобождается память.
351
07 марта 2006 года
PitxBull
633 / / 22.12.2004
Код:
// merge.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <string>

void merge( std::string str1,
            std::string str2,
            std::string& result )
{
    result = str1;
    result += str2;
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::string str1("abc");
    std::string str2("def");

    std::string merged_str;

    merge ( str1, str2, merged_str );
   
    return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог