Правильность кода
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 практически во всех функциях управлениями строк, где происходит изменение длины строки, это верно?
Хотелось бы услышать мнения о правильности использования new в этой функции:
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 практически во всех функциях управлениями строк, где происходит изменение длины строки, это верно?
Если ты выделяешь память в функции, то ты ее там и должен освободить.
нужно выделить память и под \0 символ.
Значит не new char [length], а new char [length + 1].
У меня такие опреаторы new практически во всех функциях управлениями строк, где происходит изменение длины строки, это правильно?
Не могу, компилятор ругается когда видит delete [] строка.
Значит не new char [length], а new char [length + 1].
Не могу, компилятор ругается когда видит delete [] строка.
Ну так удалять-то ты должен уже вне этой функции, ты же возвращаешь указатель на новую строку.
Хотелось бы услышать мнения о правильности использования new в этой функции:
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 практически во всех функциях управлениями строк, где происходит изменение длины строки, это верно?
НИКОГДА не надо делать ТАКОГО. Выделять - в одной функции, удалять - в другой. Потом ошибки будешь искать сутками. Передавай в эту функцию указатель на уже выделенный блок и его размер. Если размер недостаточен,то обрезай вывод. А что будет представлять этот указатель-уже не важно. Будь то указатель на динамическую память или на массив, что хошь, то и передавай, только не забывай учитывать размер. Система всегда должна быть замкнутой...
НИКОГДА не надо делать ТАКОГО. Выделять - в одной функции, удалять - в другой. Потом ошибки будешь искать сутками. Передавай в эту функцию указатель на уже выделенный блок и его размер. Если размер недостаточен,то обрезай вывод. А что будет представлять этот указатель-уже не важно. Будь то указатель на динамическую память или на массив, что хошь, то и передавай, только не забывай учитывать размер. Система всегда должна быть замкнутой...
Для того, чтоб выделить память, сперва нужно определить его размер. В данном случае это 3 команды и тогда будем иметь
int length_2 = strlen (string_2);
int length = length_1 + length_2;
char * result = new char [length];
merge(result, string_1, string_2)
...
Для того, чтоб выделить память, сперва нужно определить его размер. В данном случае это 3 команды и тогда будем иметь
int length_2 = strlen (string_2);
int length = length_1 + length_2;
char * result = new char [length];
merge(result, string_1, string_2)
...
Наиболее правильным вариантом бы было :
std::string str2,
std::string& result )
таким образом мы создаем и удаляем строку в вызывающей функции, а память для нее выделяем в функции merge ( посредством задания значения переменной result ). Затем при удалении переменной result в вызывающем коде освобождается память.
//
#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;
}