С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
1

Программа вылетает при запуске из консоли ( утечка)

24.10.2013, 22:24. Показов 1128. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Столкнулся с интересной проблемой. Написал программу(см.ниже, в ней две небольших утечки - см.ниже). При фиксированных параметрах argv программа работает корректно. При задании же параметров с коммандной строки возникает Expression: CrtIsValidHeapPointer связанный скорре всего с какой то из утечек. Вот код:
main.cpp
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
#include "sort.h"
#include "storage.h"
//#include <vld.h>
using namespace storage;
int main(int argc,char* argv[]){
    FILE* in;
    FILE* out;
    /*argc=5;
    argv[1]="s";
    argv[2]="a";
    argv[3]="Input.txt";
    argv[4]="Output.txt";*/
    in=fopen(argv[3],"r");
    out=fopen(argv[4],"w");
    Storage* a=(Storage*)malloc(0);//[B]Memory leak ЗДЕСЬ[/B]
    a->count=0;
    a->pchars=(char**)malloc(0);//[B]Memory leak ЗДЕСЬ[/B]
    a->pchars[0]=(char*)malloc(0);//[B]Memory leak И ЗДЕСЬ[/B]
    a->allocated=0;
    Read(in,a);
    if(argv[1]== "s"){
        if(argv[2]=="a")
            sort(a->pchars,a->count,1);
        else
            sort(a->pchars,a->count,0);
        for(int i=0;i<a->count;i++)
            fprintf(out,"%s \n",a->pchars[i]);
    };
    if(argv[1]=="i"){
        int* b=(int*)malloc(a->count*sizeof(int));
        for(int i=0;i<a->count;i++)
            sscanf(a->pchars[i],"%d",&b[i]);
        if(argv[2]=="a")
            sort(b,a->count,1);
        else
            sort(b,a->count,0);
        for(int i=0;i<a->count;i++)
            fprintf(out,"%d \n",b[i]);
        free(b);
    };
        if(argv[1]=="d"){
            double* b=(double*)malloc(a->count*sizeof(double));
            for(int i=0;i<a->count;i++)
                sscanf(a->pchars[i],"%lf",&b[i]);
            if(argv[2]=="a")
                sort(b,a->count,1);
            else
                sort(b,a->count,0);
            for(int i=0;i<a->count;i++)
                fprintf(out,"%lf \n",b[i]);
        free(b);
        };
 
    freeS(a);//чистит структуру
    fcloseall();
};
storage.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once
#include<iostream>
#include<string>
using namespace std;
namespace storage {
   struct Storage {
        int count;        //хранит текущее число используемых элементов в массиве
        int allocated;  //хранит реальный  выделенный размер массива pchars(1024*count*sizeof(char)
        char **pchars;  //массив указателей, размер которого можно динамически изменять
    };
    Storage* allocate(int initial_capacity);/* Создает экземпляр структуры в динамической памяти и выделяет память под pchars заданного размера */
    /*Освобождает память под строки указатели на которые хранятся в pchars, память под pchars и  структуру Storage */
    void freeS (Storage* pcont);
    /* Добавляет (копирует) строку в содержимое, при этом при необходимости изменяет размер выделенной памяти под pchars  увеличивая его в полтора раза */
    void add_string (Storage* pcontent, const char* pchars);
    void Read (FILE* in,Storage* s);
};
storage.cpp
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
#include "storage.h"
#include <stdio.h>
using namespace std;
namespace storage {
    Storage* allocate(int chislo_count){
    Storage* a;
    a->pchars=(char**)malloc(chislo_count*sizeof(char*));
    for(int i=0;i<chislo_count;i++)
        a->pchars[i]=(char*)malloc(1024*sizeof(char));
    a->count=chislo_count;
    a->allocated=1024*sizeof(char);
    return a;
    };
    void freeS(Storage* pcont){
        for(int i=0;i<pcont->count;i++)
            free(pcont->pchars[i]);
        free(pcont->pchars);
    };
    void add_string (Storage* pcontent, const char* pchars){
        pcontent->count++;
        pcontent->pchars=(char**)realloc(pcontent->pchars,pcontent->count*sizeof(char*));
        pcontent->pchars[pcontent->count-1]=(char*)malloc(1024*sizeof(char));
        int i=0;
        while(pchars[i]!='\0'){
            pcontent->pchars[pcontent->count-1][i]=pchars[i];
            i++;
        }
        pcontent->pchars[pcontent->count-1][i]='\0';
    };
    void Read(FILE* in,Storage* a){
        char c[1024];
        int i=0;
        while(!feof(in)){
        i++;
        fscanf(in,"%s",&c);
        add_string(a,c);
        };
    };
};
При необходимости приложу остальные файлы, но думаю они отношения к делу не имеют так как там работы с памятью нет а исключительно алгоритмы сортировки.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.10.2013, 22:24
Ответы с готовыми решениями:

Программа вылетает при запуске
День всем добрый! Я недавно заметил такую особенность. Если размещать файл программы по...

При запуске из среды программа работает, при запуске выполняемого файла выдает ошибку
Добавлено через 1 минуту 35 секунд как исправить ошибки в названии темы? там должно было быть...

Змейка вылетает при запуске
Программа вилетает сразу при запуске. #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

При запуске вылетает,а почему?
#include &lt;iostream&gt; using namespace std; const int MAX=100; //ìàêñèìàëüíîå êîëè÷åñòâî ñèìâîëîâ â...

2
шКодер самоучка
2282 / 1958 / 945
Регистрация: 09.10.2013
Сообщений: 4,369
Записей в блоге: 10
24.10.2013, 22:34 2
а разве malloc(0) не равно NULL?
0
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
25.10.2013, 07:16  [ТС] 3
При убирании этих строк программа ломается на realloc'e. Отсюда вывод что наверное не одно и тоже.
0
25.10.2013, 07:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.10.2013, 07:16
Помогаю со студенческими работами здесь

При запуске программы вылетает Dev-C++
Здравствуйте! Хотел я сделать программу которая. Просит на вход несколько данных. А на выходе...

При запуске приложения вылетает сообщение
При запуске приложения вылетает следующее, приложение рабочее, помогите пожалуйста(

Вылетает ошибка при запуске программы
Написал несложную программу сложения матриц. Скомпилирывал все нормально, ошибок нема. Начинаюца...

При запуске прогаммы из папки Release вылетает
Есть программа написанная мной(500 строк) Если запускаю дебаг, все работает так как надо Если...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru