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

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

Восстановить пароль Регистрация
 
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
24.10.2013, 22:24     Программа вылетает при запуске из консоли ( утечка) #1
Добрый день. Столкнулся с интересной проблемой. Написал программу(см.ниже, в ней две небольших утечки - см.ниже). При фиксированных параметрах 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);
        };
    };
};
При необходимости приложу остальные файлы, но думаю они отношения к делу не имеют так как там работы с памятью нет а исключительно алгоритмы сортировки.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.10.2013, 22:24     Программа вылетает при запуске из консоли ( утечка)
Посмотрите здесь:

При запуске из среды программа работает, при запуске выполняемого файла выдает ошибку C++
C++ вылетает ошибка при запуске программы
C++ При запуске вылетает,а почему?
C++ При запуске прогаммы из папки Release вылетает
При запуске приложения вылетает сообщение C++
C++ При запуске программы вылетает Dev-C++
C++ При запуске консоли автоматически устанавливать шрифт Lucida Console
Подскажете пожалуйста, почему при запуске консоли нет останова? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Max Dark
В поиске работы
 Аватар для Max Dark
1546 / 1399 / 501
Регистрация: 09.10.2013
Сообщений: 3,185
Записей в блоге: 8
Завершенные тесты: 2
24.10.2013, 22:34     Программа вылетает при запуске из консоли ( утечка) #2
а разве malloc(0) не равно NULL?
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
25.10.2013, 07:16  [ТС]     Программа вылетает при запуске из консоли ( утечка) #3
При убирании этих строк программа ломается на realloc'e. Отсюда вывод что наверное не одно и тоже.
Yandex
Объявления
25.10.2013, 07:16     Программа вылетает при запуске из консоли ( утечка)
Ответ Создать тему
Опции темы

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