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

При вызове деструктора возникает ошибка Debug Assertion Failed! - C++

Восстановить пароль Регистрация
 
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
22.09.2013, 17:09     При вызове деструктора возникает ошибка Debug Assertion Failed! #1
вот код программы
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
class String
{
private:
    char *str;
public:
    String (char *ustr)
    {
        str = new char [80];
        str = ustr;
    }
    void Print()
    {
        cout<<"String is:   "<<str;
    }
    ~String()
    {
        cout<<"Destrukcor";
        delete [] str;
    }
};
 
void main()
{
    String user("User string");
    user.Print();
}
При вызове деструктора возникает ошибка
Debug Assertion Failed!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.09.2013, 17:09     При вызове деструктора возникает ошибка Debug Assertion Failed!
Посмотрите здесь:

C++ Ошибка компиляции (Debug Assertion Failed)
ошибка debug assertion failed C++
C++ ошибка "Debug Assertion Failed".Line 1441!
C++ Ошибка "Debug Assertion Failed" после выполнения программы
C++ Ошибка debug assertion failed, как избавиться?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11824 / 6803 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
22.09.2013, 17:11     При вызове деструктора возникает ошибка Debug Assertion Failed! #2
C++
1
2
str = new char [80];
str = ustr;
утечка памяти, плюс UB при попытки освободить, т.к. ustr в данном случае содержит адрес строкового литерала
C++
1
2
str = new char [strlen(ustr)+1];
strcpy(str,ustr) ;
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
22.09.2013, 19:26  [ТС]     При вызове деструктора возникает ошибка Debug Assertion Failed! #3
Все работает, спасибо!
А почему не выводится сообщение в деструкторе?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11824 / 6803 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
22.09.2013, 19:29     При вызове деструктора возникает ошибка Debug Assertion Failed! #4
Цитата Сообщение от vozup Посмотреть сообщение
А почему не выводится сообщение в деструкторе?
Потому что деструктор вызовется после выхода из main и Вы ничего не увидите просто
Запустите из под консоли, либо
C++
1
2
3
4
5
6
7
8
int main()//int main
{
   {
    String user("User string");
    user.Print();
   }
   //здесь паузу поставить.
}
Если в студии, то можно ctrl+F5
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
22.09.2013, 19:43  [ТС]     При вызове деструктора возникает ошибка Debug Assertion Failed! #5
Вот програма побольше
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
class Person
{
private:
    int age;
    char *name;
    char *state;
    int tel_number;
public:
    Person()
    {
        age = 0;
        tel_number = 0;
        name = new char[15];
        state = new char[15];
        name = "No information";
        state = "No information";
    }
    Person(char *uname, char *ustate, int age, int tel_number)
    {
        name = new char[strlen(uname)+1];
        state = new char[strlen(ustate)+1];
        this ->age = age;
        this ->tel_number = tel_number;
        strcpy(name,uname);
        strcpy(state,ustate);
    }
    ~Person()
    {
        delete [] name;
        delete [] state;
        cout<<"End of destructor";
    }
    void Print();
    Person ChangeName();
};
 
void Person::Print()
{
        cout<<"Name: "<<name<<endl;
        cout<<"State: "<<state<<endl;
        cout<<"Age: "<<age<<" years old"<<endl;
        cout<<"Telephon number is: "<<tel_number<<endl;
}
 
Person Person::ChangeName()
{
    cout<<"Enter new name: ";
    cin>>name;
    return *this;
}
 
int main()
{
    Person adam("Name","state",12,555666);
    adam.Print();
    adam.ChangeName().Print();//Смена имени
    getch();
    return 0;
}
Такая же беда, имя меняется, выводится но по выходу с программы таже ошибка
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11824 / 6803 / 769
Регистрация: 27.09.2012
Сообщений: 16,871
Записей в блоге: 2
Завершенные тесты: 1
22.09.2013, 19:56     При вызове деструктора возникает ошибка Debug Assertion Failed! #6
Цитата Сообщение от vozup Посмотреть сообщение
Такая же беда
такая же ошибка:
C++
1
2
3
4
        name = new char[15];
        state = new char[15];
        name = "No information";
        state = "No information";
Цитата Сообщение от Croessmah Посмотреть сообщение
утечка памяти, плюс UB при попытки освободить, т.к. Вы присваиваете указателям адреса строковых литералов
Почитайте что-нибудь о Си-строках

Добавлено через 4 минуты
C++
1
2
3
4
5
6
        char * pNoInfoStr = "No information" ;
        size_t  sizeNoInfoStr = strlen ( pNoInfoStr ) + 1 ;
        name = new char[sizeNoInfoStr];
        state = new char[sizeNoInfoStr];
        strcpy ( name , pNoInfoStr ) ;
        strcpy ( state , pNoInfoStr ) ;
Добавлено через 1 минуту
C++
1
2
3
4
5
6
Person Person::ChangeName()//Возвращение без ссылки приведет к созданию нового объекта, только вот не похоже, что здесь нужна копия
{
    cout<<"Enter new name: ";
    cin>>name; //имя может быть длиннее предыдущего и может вылезти за пределы выделенной памяти
    return *this;
}
vozup
5 / 5 / 0
Регистрация: 25.12.2011
Сообщений: 99
22.09.2013, 20:56  [ТС]     При вызове деструктора возникает ошибка Debug Assertion Failed! #7
Спасибо большое!
Mukue
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 35
23.12.2013, 01:18     При вызове деструктора возникает ошибка Debug Assertion Failed! #8
А мне можете помочь? у меня тоже такая проблема, только сделано вроде все, как вы говорите. Проблема в деструкторе:
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
\
#include "stdafx.h"
#include <iostream>
#include <cstring> // для strcpy
using namespace System;
using namespace std;
class Student
{
public:
    char *name;
    int course;
    bool gender;
    Student();//конструктор без параметров
    Student(char *pname, int pcourse, bool pgender)//конструктор с параметрами
    {
        name= new char[strlen(pname)+1];
        strcpy(name, pname);
        course=pcourse;
        gender=pgender;
        cout<<"Parameterized constructer has operated"<<endl;
    };
    Student(const Student& ref)//конструктор копирования
    {
        name= new char[strlen(ref.name)+1];//теперь name ссылается на пустой массив(выделение памяти)
        strcpy(name, ref.name);
        course = ref.course;
        gender=ref.gender;
        cout<<"Copying constructer has operated"<<endl;
    };
    ~Student()//деструктор класса Student
    {
        delete name;
        cout<<"Destructor has operated"<<endl;
    }
    void Print()//вывод на экран информации о студенте
    {
        char cgender[10];
        if (gender) strcpy(cgender, "Male");
        else strcpy(cgender, "Female");
        cout<<"Name: "<<name<<" Course: "<<course<<" Gender: "<<cgender<<endl;      
    }
    void SetCourse(int c)//функция для установки значения курса студента
    {
        course =c;
    }
    void SetName(char* c)//функция для установки значения имени студента
    {
        strcpy(name,c);
    }
    void SetGender(bool c)//функция для установки значения пола студента
    {
        gender = c;
    }
 
};
int main()
{
    Student st1("Dima", 3, true);
    Student *stref1=&st1; // указатель на экземпляр класса
    stref1->Print();
 
    Student st2=st1;// вызов конструктора копирования
    stref1=&st2; // смена значения адреса у stref1 на адрес st2
    
 
    void(Student::*stref2)(); // указатель на компоненту-функцию
    stref2=&Student::Print;
    (st1.*stref2)(); //вызов метода Print() через указатель stref2
    delete stref1;// вызов деструктора
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2013, 01:44     При вызове деструктора возникает ошибка Debug Assertion Failed!
Еще ссылки по теме:

Debug Assertion Failed! C++
Ошибка выполнения: Debug assertion failed C++
Debug assertion failed при освобождении памяти C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.12.2013, 01:44     При вызове деструктора возникает ошибка Debug Assertion Failed! #9
C++
1
delete [] name;
Цитата Сообщение от Mukue Посмотреть сообщение
delete stref1;// вызов деструктора
stref1 разве связан с динамической памятью? Если нужно увидеть сообщение о работе деструктора, поместите код в main()(до system("pause")) в {}.
Yandex
Объявления
23.12.2013, 01:44     При вызове деструктора возникает ошибка Debug Assertion Failed!
Ответ Создать тему
Опции темы

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