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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Компилирование библиотеки dll из cxx и h файлов http://www.cyberforum.ru/cpp-beginners/thread987195.html
реально-ли скомпилировать dll библиотеку из с++(шных) файлов написаных под Unix?
C++ Найти все меньшие N из числел Мерсена Дано натуральное число N. Найти все меньшие N из числел Мерсена. Простое число называется числом Мерсена, если оно может быть представлено в виде 2p-1, где p – тоже простое число. http://www.cyberforum.ru/cpp-beginners/thread987193.html
C++ Нужно сделать, чтобы в Edit можно было вводить не более 3-х символов
Нужно сделать, чтобы в Edit можно было вводить не более 3-х символов
C++ Вывести текст в конце программы
Итак, у меня есть программа, которая множит числа на числа и находит некоторые нужные для меня числа. И задача состоит в том, что потом их нужно вывести все вместе в конце. Нужно вывести все значения v==i в конце программы, мои криворуки это сделать не могут._. int a,b,c; int v; int k; for(int i=100; i<1000; i++) { for(int j=2; j<101; j++) { a=i/100; b=i/10-a*10;...
C++ Подскажите с функцие сортировки http://www.cyberforum.ru/cpp-beginners/thread987183.html
Есть код: #include<iostream> #include<vector> using namespace std; int main () { vector<string> v1; v1.push_back("Sergey"); v1.push_back("Ivan"); v1.push_back("Petr");
C++ Динамический массив Помогите решить задачу способом динамических массивов. Дана действительная матрица размера mxn, в которой не все элементы равны нулю. Получить новую матрицу путем деления всех элементов данной матрицы на ее наибольший по модулю элемент. подробнее

Показать сообщение отдельно
Linzman
0 / 0 / 0
Регистрация: 31.10.2012
Сообщений: 48
24.10.2013, 22:24     Программа вылетает при запуске из консоли ( утечка)
Добрый день. Столкнулся с интересной проблемой. Написал программу(см.ниже, в ней две небольших утечки - см.ниже). При фиксированных параметрах 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);
        };
    };
};
При необходимости приложу остальные файлы, но думаю они отношения к делу не имеют так как там работы с памятью нет а исключительно алгоритмы сортировки.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru