Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
#1

Надо применять delete [] или нет - C++

03.08.2013, 19:01. Просмотров 323. Ответов 3
Метки нет (Все метки)

Привет.
Читаю книгу Прата и выполняю задания.
Гл.8 Зд.4:
Мое решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
#include <cstring> //для strlen(), strcpy()
 
struct stringy
{
    char * str; //указатель на строку
    int ct; //длина строки не считая '\0'
};
 
void set(stringy & stry, const char * str);
void show(const stringy &, int cnt = 1);
void show(const char *, int cnt = 1);
int main()
{
    system("chcp 1251");
 
    stringy beany;
    char testing[] = "Reality isn't what it used to be.";
    set(beany,testing); //первым аргументом является ссылка
    //Выделяет пространство для хранения копии testing
    //использует элемент типа str структуры beany как указатель
    //на новый блок, копирует testing в новый блок и
    //создает элемент ct структуры beany
    show(beany); //выводит строковый член структуры один раз
    show(beany,2); //выводит строковый член структуры два раза
    testing[0] = 'D';
    testing[1] = 'u';
    show(testing); //выводит строку testing один раз
    show(testing,3); //выводит строку testing три раза
    show("Done!\n");
 
    delete [] beany.str;
 
    system("PAUSE");
    return 0;
}
 
void set(stringy & stry, const char * str)
{
    stry.ct = strlen(str);
    stry.str = new char[stry.ct+1];
    strcpy(stry.str, str);
 
}
void show(const stringy & stry, int i)
{
    while(i>0)
    {
        cout << stry.str << endl;
        --i;
    }
}
void show(const char * str,int i)
{
    while(i>0)
    {
        cout << str << endl;
        --i;
    }
}
Решение нашел в инете:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// pe8-4.cpp
#include <iostream>
#include <cstring>    // for strlen(), strcpy()
using namespace std;
 
struct stringy {
    char * str;        // points to a string
    int ct;        // length of string (not counting '\0')
    };
 
 
void show(const char *str, int cnt =  1);
void show(const stringy & bny, int cnt = 1);
void set(stringy & bny, const char * str);
 
int main(void)
{
    stringy beany;
    char testing[] = "Reality isn't what it used to be.";
 
    set(beany, testing);    // first argument is a reference,
            // allocates space to hold copy of testing,
            // sets str member of beany to point to the
            // new block, copies testing to new block,
            // and sets ct member of beany
    show(beany);        // prints member string once
    show(beany, 2);    // prints member string twice
    testing[0] = 'D';
    testing[1] = 'u';
    show(testing);    // prints testing string once
    show(testing, 3);    // prints testing string thrice
    show("Done!");
    return 0;
}
 
void show(const char *str, int cnt)
{
    while(cnt-- > 0)
    {
            cout << str << endl;
    }
}
 
void show(const stringy & bny, int cnt)
{
    while(cnt-- > 0)
    {
            cout << bny.str << endl;
    }
}
 
void set(stringy & bny, const char * str)
{
    bny.ct = strlen(str);
    bny.str = new char[bny.ct+1];
    strcpy(bny.str, str);
}
В функции set() выделяется динамически память, я своем примере удалил выделенную память после использования, в другом решении, удаления не было. Как правильно делать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2013, 19:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Надо применять delete [] или нет (C++):

Слово break после default (надо или нет) - C++
Книга предлагает такую запись оператора switch: switch (выражение) { case значениеОдин: оператор; break; case значениеДва:...

Что быстрее/эффективнее malloc/realloc или new/delete? - C++
Всем привет. Год программировал на СИ под микроконтроллеры... Начал изучать с++... Всё ново, интересно... Доковырялся до STL... В процессе...

Ошибка с массивами, хотя формально её нет (похожи ли массивы или нет?) - C++
Всем доброго времени суток!) В общем имею такую великолепную чтуку, она должна говорить мне, похожи ли массивы или нет, массив должен...

Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если требуемых слов нет - C++
Дана последовательность символов, состоящая из слов. Вывести на экран слова, в которых все символы повторяющиеся, или сообщение «Нет», если...

В чем разница между delete и delete[]? - C++
а можете еще по подробней рассказать про delete, точнее даже delete, чем именно отличается delete от delete, т.к. я попробовал...

Чем отличается delete[] от delete? - C++
чем отличается? delete mas от delete mas

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
kventin_zhuk
БНТУ ФИТР
215 / 155 / 15
Регистрация: 26.12.2012
Сообщений: 382
03.08.2013, 19:11 #2
У вас правильно, а автор в интернете забил на освобождение памяти.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.08.2013, 19:35 #3
Цитата Сообщение от Hugra Посмотреть сообщение
Как правильно делать?
То что выделено через new, должно быть освобождено через delete.
Даниил
67 / 40 / 7
Регистрация: 14.05.2013
Сообщений: 383
03.08.2013, 20:56 #4
Вы б хоть задачу для приличия написали, а то не у каждого ведь эта книга есть..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2013, 20:56
Привет! Вот еще темы с ответами:

Как найти текст в файле и возвратить 0 или 1 в зависимости от того,найдено или нет? - C++
bool fnd(char* fn,string stf) { string s; ifstream ifs(fn); while (!ifs.eof()) { getline(ifs,s); ...

Вывести True или False в зависимости от того, имеют три заданных целых числа одинаковую четность или нет - C++
Всем привет! Помогите, пожалуйста в решении задачи. Знаю, что задачи более,или менее лёгкие,но я в c++ почти ничего не смыслю, а лабы...

Можно ли писать такой код,мне в дальнейшем надо будет наследовать x и y, а другие два елемента нет - C++
сlass A { private: int a; public int x; A() { x=0; }

delete или new (typeid(void*))(void*) - C++
Доброе время суток. Пишу список. Телом каждого элемента (el) списка является void указатель(body). (предполагается что тело элемента...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.08.2013, 20:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru