Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Matanoid
10 / 0 / 1
Регистрация: 12.10.2015
Сообщений: 39
#1

Неправильное выведение памяти для динамического массива - C++

05.10.2016, 13:54. Просмотров 146. Ответов 4
Метки нет (Все метки)

Написал несложную программу. Когда в одном объекте вывожу динамический массив другого вложенного объекта, выдает ошибку в этих строках
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void Show() {
        for (int i = 0; i < size; i++) {
 
                    for (int j = 0; j < sizeof(((*one).getText())); j++) {
 
                        cout << "a :" << *((*one).getText()) << "\n";
                        ((*one).getText())++;
                    }
                    ((*one).getText()) -= sizeof(((*one).getText()));
                }           
            one -= size;
 
        }
Помогите, пожалуйста, разобраться в причине.
Написал два варианта. Ни один из них работает!
Первый вариант:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <stdio.h>
#include <direct.h>
 
 
using namespace std;
 
class One
{
private:
    char * text;
 
public:
    One() {
        text = new char[sizeof("text")];
        strcpy(text,"text");
    }
 
    ~One() {
        delete[] text;
    };
 
    char * getText() {
        return text;
    }
 
    void showText() {
        cout << "text :" << "\n";
        for (int i = 0; i < sizeof(text); i++) {
            cout << *text;
            text++;
        }
        text -= sizeof(text);
        cout << "\n";
    }
};
 
 
class Two {
 
private:
    One * one;
    int size;
 
public:
    Two() {
        size = 2;
        one = new One[size];
        cout << "constructor\n";
    }
 
    ~Two() {
        delete[] one;
        cout << "destructor\n";
    }
 
    void Show() {
        cout << "Show One Object text :" << "\n";
        for (int i = 0; i < size; i++) {
 
            for (int j = 0; j < sizeof(((*one).getText())); j++) {
 
                cout << "a :" << *((*one).getText()) << "\n";
                ((*one).getText())++;
            }
            ((*one).getText()) -= sizeof(((*one).getText()));
        }
        one -= size;
    }
};
 
void main() {
 
    Two two;
    two.Show();
    cout << "FINISH : " << "\n";
    system("pause");
}
Второй вариант:
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#include <stdio.h>
#include <direct.h>
 
 
using namespace std;
 
class One
{
private:
    char * text;
 
public:
    One() {
        text = new char[sizeof("text")];
        strcpy(text,"text");
    }
 
    ~One() {
        delete[] text;
    };
 
    char * getText() {
        return text;
    }
 
    void showText() {
        cout << "text :" << "\n";
        for (int i = 0; i < sizeof(text); i++) {
            cout << *text;
            text++;
        }
        text -= sizeof(text);
        cout << "\n";
    }
};
 
 
class Two {
 
private:
    One * one;
    int size;
 
public:
    Two() {
        size = 2;
        one = new One[size];
        cout << "constructor\n";
    }
 
    ~Two() {
        delete[] one;
        cout << "destructor\n";
    }
 
    void Show() {
        cout << "Show One Object text :" << "\n";
        for (int i = 0; i < size; i++) {
            (*one).showText();
        }
        one -= size;
    }
};
 
void main() {
 
    Two two;
    two.Show();
    cout << "FINISH : " << "\n";
    system("pause");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.10.2016, 13:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Неправильное выведение памяти для динамического массива (C++):

Выделение памяти для динамического двумерного массива внутри функции - C++
Имеется вот такой код : #include &lt;iostream&gt; void allocateMemory(int ***array, int size); void freeMemory(int **array, int size); ...

Сколько памяти необходимо для динамического хранения массива из 5 элементов - C++
Сколько памяти необходимо для динамического хранения массива из 5 элементов, каждый из которых занимает 7 байт памяти, в 64-х разрядной ОС?...

Если выделение памяти для динамического массива задать void-функцией, можно ли будет оперировать с ним в main? - C++
Если выделение памяти для дин.массива задать void-функцией, можно ли будет оперировать с ним в main или придётся отдельно выделять память в...

Удаление двумерного динамического массива из памяти - C++
Допустим дан двумерный динамический массив (созданный с помощью new). Как правильно удалить его из памяти? У меня есть три варианта: ...

Освобождение памяти у динамического массива char - C++
Добрый день. Имеем код: class _ArrayChar { typedef int Ivalue; typedef char* Pchar; typedef const char Cchar;

Освобождение памяти динамического массива. Деструктор - C++
Почему выдает ошибку при написании деструктора? Если его убрать, то все работает. #pragma once #ifndef MATRIX_H #define...

4
nd2
2470 / 2059 / 719
Регистрация: 29.01.2016
Сообщений: 6,758
05.10.2016, 14:23 #2
Добавлено через 1 минуту
Цитата Сообщение от Matanoid Посмотреть сообщение
C++
1
for (int i = 0; i < sizeof(text); i++)
sizeof() выдаст размер указателя, а не слова. strlen() используй.

Добавлено через 4 минуты
C++
1
for (int i = 0; i < strlen(text); i++)
C++
1
text = new char[strlen("text") + 1];
Добавлено через 13 минут
Цитата Сообщение от Matanoid Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
void showText() {
    cout << "text :" << "\n";
    for (int i = 0; i < sizeof(text); i++) {
        cout << *text;
        text++;
    }
    text -= sizeof(text);
    cout << "\n";
}
C++
1
2
3
4
void showText() {
    cout << "text :" << "\n";
    cout << text << '\n';
}
0
Matanoid
10 / 0 / 1
Регистрация: 12.10.2015
Сообщений: 39
05.10.2016, 16:52  [ТС] #3
nd2, почитайте код метода strlen() и не пишите не провереный и неправильный код пожалуйста. К сожалению, все ваши ответы неправильны.

Добавлено через 19 минут
Программа выдает ошибку в деструкторе , здесь:
C++
1
2
3
4
~Two() {
        delete[] one;
        cout << "destructor\n";
    }
Если закомментировать строку:
C++
1
delete[] one;
то программа работает нормально.
Но в чем проблема не могу понять.
0
nd2
2470 / 2059 / 719
Регистрация: 29.01.2016
Сообщений: 6,758
05.10.2016, 23:00 #4
Цитата Сообщение от Matanoid Посмотреть сообщение
К сожалению, все ваши ответы неправильны.
В чём неправильные? Давай проверим.
C++
1
2
3
4
5
   char* text = new char[strlen("123456789") + 1];
   strcpy(text, "123456789");
   cout << sizeof(text) << endl; // выведет 4 (размер указателя в х86)
   cout << text << endl; // вывод строки
   delete [] text;
Про void showText(). Что ты там делаешь вообще непонятно. Если нужно вывести строку, то просто передаёшь в поток вывода указатель на строку. И delete у меня нормально срабатывает, а ты память где-то портишь.
1
Миниатюры
Неправильное выведение памяти для динамического массива  
Matanoid
10 / 0 / 1
Регистрация: 12.10.2015
Сообщений: 39
05.10.2016, 23:45  [ТС] #5
nd2, все еще раз перепроверил. Вроде работает. Может где то допустил ошибку ранее. Спасибо за помощь!
0
05.10.2016, 23:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2016, 23:45
Привет! Вот еще темы с ответами:

Освобождение памяти динамического массива структур - C++
Поставлена следующая задача: сделать любую структуру, сгененировать в неё рандомные данные, записать в бинарник. Потом считать из...

Освобождение памяти после динамического массива - C++
Есть динамический массив, но почему-то на строке delete FirstPoint; студия (2010) пишет что-то про попытку записи в память после конца кучи...

Необходим совет при освобождения памяти динамического массива - C++
Имеется код: -создание трехмерного динамического массива float ***Kadr; Kadr = new float **; for (int i = 0; i &lt; D-&gt;Np; i++)...

Вылетает функция очистки памяти двумерного динамического массива - C++
Я написал функции добавления и удаления столбцов и строчек двумерного динамического массива, создал меню, но когда сделаю несколько...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

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