5 / 5 / 4
Регистрация: 13.05.2014
Сообщений: 130
1

Выделение и очищение памяти при работе с динамическими строками

12.11.2014, 02:22. Показов 488. Ответов 2
Метки нет (Все метки)

Всем Доброго времени суток!
Пожалуйста укажите на ошибку!

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
#ifndef RECEIPT_H
#define RECEIPT_H
#include <iostream>
 
using namespace std;
 
class cProduct
{
    int amount_product;
    double cost_product;
    char* name_product;
public:
    cProduct();
    cProduct(const cProduct&);
    void Set_amount_product (const int a_p) {amount_product=a_p;}
    void Set_cost_product (const double c_p) {cost_product=c_p;}
    void Set_name_product (const char* n_p) {strcpy(name_product,n_p);}
    int Get_amount_product () {return amount_product;}
    double Get_cost_product () {return cost_product;}
    char* Get_name_product () {return name_product;}
};
 
class cCustomer
{
    char* name;
    double money;
    int count;
    cProduct* product;
public:
    cCustomer();
    cCustomer(const cCustomer&);
    ~cCustomer() {delete[]product;}
    void Set_name(const char* n) {strcpy(name,n);}
    void Set_money (const double m) {money=m;}
    double GetMoney() {return money;}
    char* GetName() {return name;}
    int Get_count() {return count;}
    cProduct Get_product (int i) {return product [i];}
};
 
class cShop
{
    int c;
    cCustomer* customer;
public:
    cShop();
    ~cShop() {delete[]customer;}
    void Print_Receipt();
 
 
};
 
 
 
#endif
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
#include <iostream>
#include <ctime>
#include <iomanip>
#include "RECEIPT.h"
using namespace std;
char masNameProduct[10][10]={"Хлеб","Молока","Яйца","Чай","Кофе","Колбаса","Сосиськи","Бананы","Яблоки","Мясо"};
double masCost[10]={5.65,10.25,12.20,25.00,64.50,82.60,35.20,14.99,12.25,68.30};
int masAmount[10]={10,5,3,9,5,4,7,4,7,9};
char masNameCustomer [3][10]= {"Вася","Петя","Коля"};
double masMoney [3]={500.50,60.40,150.35};
 
cProduct::cProduct()
{
    amount_product = 0;
    cost_product = 0.0;
    name_product= NULL;
        
}
cProduct::cProduct(const cProduct& P)
{
    amount_product=P.amount_product;
    cost_product=P.cost_product;
    strcpy(name_product,P.name_product);
}
 
cCustomer::cCustomer()
{
    name=new char [3];
    strcpy(name,NULL);
    money=0.0;
    srand ((unsigned)time(NULL));
    count = rand()%10;
    product=new cProduct [count];
    for (int i=0;i<count;i++)
    {
        int k = rand()%10;
        product[i].Set_name_product (masNameProduct[k]);
        product[i].Set_cost_product(masCost[k]);
        product[i].Set_amount_product(masAmount[k]);
    }
}
 
cCustomer::cCustomer(const cCustomer&C)
{
    
        money = C.money;
        strcpy(name,C.name);
}
 
 
cShop::cShop()
{
    customer=new cCustomer[3];
    for (int i=0;i<3;i++)
    {
        customer[i].Set_name(masNameCustomer[i]);
        customer[i].Set_money(masMoney[i]);
    }
 
}
 
 
void cShop::Print_Receipt()
{
    setlocale(LC_ALL,"RUS");
    
    for(int i=0;i<c;i++)
    {
        cout<<customer[i].GetName()<<'\t'<<customer[i].GetMoney()<<endl;
        for(int j=0;j<10;j++)
        {
            cout<<customer[i].Get_product(j).Get_name_product()<<endl;
            cout<<customer[i].Get_product(j).Get_cost_product()<<endl;
            cout<<customer[i].Get_product(j).Get_amount_product()<<endl;
        }
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <ctime>
#include <iomanip>
 
#include "RECEIPT.h"
using namespace std;
 
int main()
{
    cShop shop;
    shop.Print_Receipt();
    return 0;
}
ошибка возникает тут
C++
1
cShop::cShop()
при входе в цикл!
Спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2014, 02:22
Ответы с готовыми решениями:

Выделение памяти при работе с объектами
Добрый день, форумчане. Нужно посчитать количество слов в строке. Исходные данные: 1. Строка...

Утечка памяти при работе со строками в TList
Есть следующий код: var s2: string; pString: ^String; n:byte; begin ...

Правильно ли в приведенном примере реализовано выделение и очищение памяти под двумерный вектор
Скажите правильно ли я выделяю и очищаю память под двухмерный вектор class A { private: ...

Ошибка при работе с динамическими компонентами
Делаю менюшку для игры. Пункты меню - Label и Image. При нажатии на какой либо пункт меню -...

2
С чаем беда...
Эксперт CЭксперт С++
9257 / 4757 / 1288
Регистрация: 18.10.2014
Сообщений: 10,817
12.11.2014, 03:06 2
Цитата Сообщение от Sapendo Посмотреть сообщение
C++
1
2
3
4
5
6
cProduct::cProduct(const cProduct& P)
{
  amount_product=P.amount_product;
  cost_product=P.cost_product;
  strcpy(name_product,P.name_product);
}
Указатель 'name_product' в этот момент содержит либо мусор, либо NULL. Разумеется, программа падает. Кто память для хранения 'name_product' выделать будет? Сама она не выделится.

Либо самостоятельно выделяйте память для 'name_product', либо объявите его массивом, а не указателем. Либо забудьте про все про это и используйте 'std::string'.

Совершенно аналогичная ситуация имеет место с

C++
1
void Set_name(const char* n) {strcpy(name,n);}
Опять делается попытка скопировать строку в несуществующую память.
1
Заблокирован
12.11.2014, 03:08 3
Цитата Сообщение от Sapendo Посмотреть сообщение
ошибка возникает тут
Не выделена память под имя

C++
1
2
3
4
5
void Set_name(const char* n) 
{
    name = new char[strlen(n)+1];
    strcpy(name,n);
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.11.2014, 03:08

Ошибке при работе с динамическими массивами
Добрый день, подскажите, как решить ошибку Non-terminated string(unreadable memory)?

Метот $_POST при работе с динамическими именами
Всем привет! Нужна помощь в таком вопросе. На странице размещен тест, вопросы появляются по...

Операции с указателями. Использование указателей при работе с динамическими массивами
Дан динамический массив целых чисел {ai} (i=1, 2, ...,n) , целые c и d (c &lt; d). Написать программу...

Важно:207 ошибка при работе с типизированными файлами и динамическими массивами
Объясните, пожалуйста, почему возникает ошибка 207 &quot;Invalid floating point operation&quot; при...


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

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

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