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

Обращение к структуре в классе с выделением памяти - C++

Восстановить пароль Регистрация
 
Spliver
Сообщений: n/a
16.09.2011, 18:37     Обращение к структуре в классе с выделением памяти #1
Добрый день уважаемые форумчане.
Столкнулся с такой проблемой. Есть класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Components {
    struct  comps{ // -- База компонентов
        char name[50];
    };
    comps  *components;
 
    int ReadComponents();
    int ReadProducts();
};
 
 
int Components::ReadProducts() {
    int b = ReadComponents();
 
    printf ("Результат: %s",components[5].name);
    // Выводится полная фигня, такое ощущение, что память выделяется только 
        //   в пределах метода, а после уничтожается
}
 
int Components::ReadComponents() {
    comps  *components = (comps*)malloc(sizeof(comps)*10);
    strcpy(components[5].name,"Prostotak");
}
и
C++
1
2
3
4
int main(int argc, char **argv) {
    Components components;
    int a = components.ReadProducts();
}
Ожидаемый ответ работы программы: Prostotak
Однако выводится полная ерунда...

Похоже на то, что метод ReadComponents выделяет память, отрабатывает верно и после завершения эту память освобождает, таким образом к Components::ReadProducts возвращается полная ерунда, которую он и выводит.

Объясните пожалуйста, как правильно выделить память или где это сделать, чтобы программа отработала верно.
Заранее спасибо за помощь.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2011, 18:37     Обращение к структуре в классе с выделением памяти
Посмотрите здесь:

C++ ошибка с выделением памяти
C++ Строки с выделением динамической памяти
C++ Конструктор с выделением памяти
Проблема с выделением памяти C++
Проблемы с выделением памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
16.09.2011, 19:02     Обращение к структуре в классе с выделением памяти #2
Цитата Сообщение от Spliver Посмотреть сообщение
// Выводится полная фигня, такое ощущение, что память выделяется только
// в пределах метода, а после уничтожается
так и есть, вы создали локалную переменную comps *components

надо писать просто
C++
1
components = (comps*)malloc(sizeof(comps)*10);
и да, почему не new ?
insolent
 Аватар для insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
16.09.2011, 19:15     Обращение к структуре в классе с выделением памяти #3
Spliver, в не void ф-ция всегда должен быть return. Из вне можно обращаться только к public методам или полям класса..
Так более правильнее..
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
class Components {
    struct  comps{ // -- База компонентов
        char name[50];
    };
    comps  *components;
 
public:
    int ReadComponents();
    int ReadProducts();
};
 
 
int Components::ReadProducts() {
    int b = ReadComponents();
 
    printf ("Результат: %s",components[5].name);
    // Выводится полная фигня, такое ощущение, что память выделяется только 
    //   в пределах метода, а после уничтожается
    return 0;
}
 
int Components::ReadComponents() {
    components = (comps*)malloc(sizeof(comps)*10);
    strcpy(components[5].name,"Prostotak");
 
    return 0;
}
Spliver
Сообщений: n/a
16.09.2011, 19:27     Обращение к структуре в классе с выделением памяти #4
Цитата Сообщение от OstapBender Посмотреть сообщение
так и есть, вы создали локалную переменную comps *components

надо писать просто
C++
1
components = (comps*)malloc(sizeof(comps)*10);
и да, почему не new ?
Все заработало Большое спасибо!
Я портирую эту программу с C, еще не до конца разобрался с new

To insolent: конечно я везде ставлю return, просто здесь я делал вырезку кода, чтобы понятнее объяснить свою проблему
Yandex
Объявления
16.09.2011, 19:27     Обращение к структуре в классе с выделением памяти
Ответ Создать тему
Опции темы

Текущее время: 21:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru