Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Ошибка при освобождении памяти


Автор: Тутанхамец 13.12.2006, 17:11
Код


void CWords5Dlg::OnButton1() 
{

FILE *fin;
int i, n=m_ed.GetWindowTextLength(); 
char * c;
c=(char *)malloc(n);

m_ed.GetWindowText((LPTSTR)c,n);
fin=fopen("c:\\fin2.dat","w+");
for(i=0; i<n;i++) fputc(*(c++),fin);
fclose(fin);
free(c);
}


На free комп выдает debug assertion failed и предлагает прервать, пропустить и повторить. 

Подскажите пожалуйста.

Автор: satrap 13.12.2006, 17:19
smile Ты изменяешь c перед тем как вызвать free().

Автор: zabivator 13.12.2006, 19:36
Тутанхамец, так это Си или Плюсы? Если Си, то откуда тогда ++? Если плюсы, то зачем батенька такие извращения?

Автор: Daevaorn 13.12.2006, 19:37
Цитата(zabivator @  13.12.2006,  20:36 Найти цитируемый пост)
так это Си или Плюсы?

первое

Автор: zabivator 13.12.2006, 19:48
Daevaorn, позор мне =((( Ступил ваще =)

Автор: V.A.KeRneL 13.12.2006, 20:05
Цитата(Daevaorn @  13.12.2006, 19:37 Найти цитируемый пост)

Цитата(zabivator @  13.12.2006,  20:36 Найти цитируемый пост)
так это Си или Плюсы?

первое

Ну, если считать с нуля, то да. smile
Ведь: 
Код

::OnButton1() 


Цитата(zabivator @  13.12.2006, 19:36 Найти цитируемый пост)

так это Си или Плюсы? Если Си, то откуда тогда ++?

В смысле?.. Инкремент и в Сях есть! Что в нём особенного, «обобщённого» или объекно-ориентированного? (риторический вопрос)

Да, кстати, подсказали бы человеку как исправить!..
Код

void CWords5Dlg::OnButton1() 
{
    FILE *fin;
    int i, n=m_ed.GetWindowTextLength(); 
    char * c;
    char * cptr;
    c=(char *)malloc(n);
    cptr = c;
    m_ed.GetWindowText((LPTSTR)c,n);
    fin=fopen("c:\\fin2.dat","w+");
    for(i=0; i<n;i++) fputc(*(cptr++),fin);
    fclose(fin);
    free(c);
}


Автор: Daevaorn 13.12.2006, 20:08
Цитата(V_A_KeRneL @  13.12.2006,  21:05 Найти цитируемый пост)
Ну, если считать с нуля, то да. ;)
Ведь: 

Да. Это из серии:
"
-Вы знаете С++? 
-Да. Мы проходили С в университете.
"

Автор: Тутанхамец 14.12.2006, 10:42
Всем спасибо, satrap и kernel - особенно. smile  

Сегодня с утра сообразил насчет изменения указателя и переделал так:

Код

void CWords5Dlg::OnButton1() 
{

FILE *fin;
int i, n=m_ed.GetWindowTextLength(); 
char * c;
c=(char *)malloc(n+1);

m_ed.GetWindowText((LPTSTR)c,n);

fin=fopen("c:\\fin2.dat","w+");

for(i=0; i<n;i++) fputc(c[i],fin);

fclose(fin);

free(c);

}


Добавлено @ 10:42 
вопрос закрыт

Добавлено @ 10:45 
Нет, стоп. Не закрыт. Zabivator, а если без извращений, есть способ попроще, чтоб скинуть в файл содержимое эдита?

Автор: Voldemar2004 14.12.2006, 11:26
Тутанхамец, вместо FILE* используй ofstream - проблем меньше будет. Зачем здесь динамически выделять память, да еще через malloc? Просто используй указатель на тип char. smile Если я правильно понял, ты хочешь записать из Бокса в файл? Есть готовый метод.

Автор: Voldemar2004 14.12.2006, 12:00
Тутанхамец, чтобы не быть привязанным к конкретным объектам:
Код
#include <fstream>

void SaveToFile(char *, char*);

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{

SaveToFile("C:\\TExt.xxx", RichEdit1->Text.c_str());

}
//---------------------------------------------------------------------------

        void SaveToFile(char *FileName, char* Text)
        {
                std::ofstream file(FileName);

                file << Text;

        }

Автор: zabivator 14.12.2006, 12:29
Тутанхамец,  вот так:
Код

void CWords5Dlg::OnButton1() 
{
std::ofstream fin("c:\\fin2.dat");
int  n=m_ed.GetWindowTextLength(); 
char * c = new char[n+1];
m_ed.GetWindowText((LPTSTR)c,n);
c[n]=0;
fin<<std::string(c);
delete [] c;
}


Добавлено @ 12:31 
Хотя у Voldemar2004 решение лучше =)

Автор: Любитель 15.12.2006, 14:43
 smile 
Интересно так разговариваем. Кто про MFC, кто про VCL. free вызываем в плюсах. Voldemar2004, в VCL можно непосредственно сохранять (метод соответствующий). В MFC GetWindowText не способна вернуть строку. Всё делается чере .. (не напрямую). А вообще в MFC проще всего так:
Код

CString text;
m_ed.GetWindowsText(text);
std::ofstream f(fileName);
f << text; // сработает приведение к LPCTSTR

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)