Error type int argument given to delete expected pointer

Ответили на вопрос 2 человека. Оцените лучшие ответы! И подпишитесь на вопрос, чтобы узнавать о появлении новых ответов.

Удаление элемента из вектора целых числе. Как исправить?

.h human


public:
vector «треугольная скобка» int «треугольная скобка» friends;

.h function

private:
vector «треугольная скобка» human* «треугольная скобка» hmn_v;


public
bool del_friend(human *hmn,int id_user)

cpp function

bool function::del_friend(human *hmn, int id_user)
{
if (hmn->friends.size()==0)
{
return false;
}
for(vector::iterator it=hmn->friends.begin(); it != hmn->friends.end(); ++it){
if(id_user==*it)
{
hmn->friends.erase(it);
it—;
}
}
delete id_user;
return true;
}

ошибка в строке delete id_user; :
ошибка: type ‘int’ argument given to ‘delete’, expected pointer


  • Вопрос задан

    более трёх лет назад

  • 160 просмотров

Пригласить эксперта

компилятор тебе прямо говорит id_user — это int
оперятор delete удаляет обьект, принимая указатель

вроде тебе эта строка вообще не нужна

1. Вы уже удалили из вектора данные вызывом
hmn->friends.erase(it);
delete нужен для очищения выделенной памяти оператором new.
2. Это лишнее:

if (hmn->friends.size()==0)
{
return false;
}

т.к. vector.begin() == vector.end() тоже, что и vector.empty(). Ваш цикл for сразу завершится, если вектор окажется пустым.


  • Показать ещё
    Загружается…

09 февр. 2023, в 18:25

5000 руб./за проект

09 февр. 2023, в 18:23

3000 руб./за проект

09 февр. 2023, в 18:08

5000 руб./за проект

Минуточку внимания

Wolf6969

0 / 0 / 0

Регистрация: 07.09.2011

Сообщений: 15

1

Проблема с выделением памяти

07.09.2011, 23:03. Показов 7565. Ответов 4

Метки нет (Все метки)


Всем привет!
Нужна помощь. Создаю класс и при компиляции возникает ошибка. Не пойму причину. Помогите пожалуйста. Конструктор должен выделять память под двумерный массив, конструктор копий должен соответственно выделить память и скопировать массив поэлементно. Но не получается пока ;(

вот код

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
#include <iostream>
#include  <conio.h>
#include <windows.h>
 
using std::cout;
using std::cin;
 
class Table{
    int size;
    int *table;
public:
    Table(int size){
        int **table = new int *[size];
        for (int i = 0; i < size; i++)
                table[i] = new int [size];
        }
 
    Table(const Table &t0){
        int **table = new int *[t0.size];   //выделение памяти для матрицы
        for (int i = 0; i < t0.size; i++)
                table[i] = new int [t0.size];
 
        for (int i = 0; i < t0.size; ++i)
            for (int j = 0; j < t0.size; ++j)
                table[i][j] = t0.table[i][j];      //строка 25
        }
 
    ~Table(){
        for (int i = 0; i < size; i++)
                delete table[i];                    //строка 30
        delete[] table;
        }
 
    int detA();
 
};
 
 
int main(int argc, char *argv[]){
    cout<<"Hello";
    Table t1(10);
    getch();
return 0;
}

ОШИБКИ:
строка 25 Invalid type argument of ‘unary *’
строка 25 Invalid type ‘int[int]’ for array subscript
строка 30 Type ‘int’ argument given to delete, expected pointer

Всем кто откликнется огромное спасибо

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



Enfernuz

22 / 22 / 2

Регистрация: 11.04.2011

Сообщений: 67

07.09.2011, 23:18

2

у вас поле-член класса int* table, а в конструкторе вы объявляете локальный указатель int** table. В строке 25 компилятор оперирует с указателем int* table (поле-член класса), а не с локальным указателем int** table.
t0.table[i][j] некорректно по этой же причине (потому что table — это int*).
Решение: сделать указатель-член класса типа int**, то есть int** table. И инициализацию делать так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Table(int size){
        table = new int* [size];
        for (int i = 0; i < size; i++)
                table[i] = new int [size];
        }
 
    Table(const Table &t0){
        table = new int* [t0.size];   //выделение памяти для матрицы
        for (int i = 0; i < t0.size; i++)
                table[i] = new int [t0.size];
 
        for (int i = 0; i < t0.size; ++i)
            for (int j = 0; j < t0.size; ++j)
                table[i][j] = t0.table[i][j];      //строка 25
        }

В деструкторе код такой:

C++
1
2
3
4
5
~Table(){
        for (int i = 0; i < size; i++)
                delete[] table[i];                    //удаляем массивы int*-ов
                delete[] table;                       //удаляем массив int**-ов
        }



1



0 / 0 / 0

Регистрация: 07.09.2011

Сообщений: 15

07.09.2011, 23:24

 [ТС]

3

Enfernuz, спасибо. Но все таки не пойму, почему не достаточно просто изменить *int в обьявлении на **int. Зачем менять инициализацию? Просто чтобы проще было?



0



Enfernuz

22 / 22 / 2

Регистрация: 11.04.2011

Сообщений: 67

07.09.2011, 23:37

4

В конструкторах вы объявляете локальный указатель типа int**, не имеющий никакого отношения к членам класса, за исключением того, что имеет такое же имя, что и указатель-член класса int* table. Завидев table в теле функции-члена класса, компилятор обратится к полю-члену класса — указателю int* table.
У класса Table в вашей реализации есть поле — одномерный массив, и это указатель int* table. Чтобы это был двумерный массив, необходим указатель int**.

Добавлено через 4 минуты
То есть, даже если вы измените int* на int** в public, в конструкторах строчка вида

C++
1
int **table = new int *[size];

будет приводить не к инициализации указателя-члена класса, а к инициализации локального экземпляра указателя типа int** (имеющего смысл только в теле функции и больше нигде).



1



Wolf6969

0 / 0 / 0

Регистрация: 07.09.2011

Сообщений: 15

08.09.2011, 00:45

 [ТС]

5

Я вьехал!!! Спасибо за подробное обьяснение. Без последней фразы не понял бы) Еще раз благодарен.

Добавлено через 21 минуту
К сожалению не все так гладко. При попытке проверить корректность выделения возникла новая трабла.

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>
#include <windows.h>
 
using std::cout;
using std::cin;
 
class Table{
    int size;
    int **table;
public:
    Table(int size){
        table = new int* [size];
        for (int i = 0; i < size; i++){
            table[i] = new int [size];
        }
 
        for (int i = 0; i < size; ++i){
            for (int j = 0; j < size; ++j){
                table[i][j]=rand()%10+1;
            }
        }
    }
 
    Table(const Table &t0){
         table = new int* [t0.size];   //выделение памяти для матрицы
         for (int i = 0; i < t0.size; i++){
             table[i] = new int [t0.size];
         }
 
         for (int i = 0; i < t0.size; ++i){
             for (int j = 0; j < t0.size; ++j){
                  table[i][j] = t0.table[i][j];
             }
         }
    }
 
    ~Table(){
        for (int i = 0; i < size; i++){
            delete[] table[i];                 //удаляем массивы int*-ов
        }
        delete[] table;                       //удаляем массив int**-ов
    }
    int detA();
 
    void showtable(){
        for (int i = 0; i < size; ++i){
            for (int j = 0; j < size; ++j){
                cout << table[i][j] << " ";
            }
            cout << "n"
        }
    }
 
};
 
 
int main(int argc, char *argv[]){
    Table t1(5);
    t1.showtable();
    cout << "Done";
    getch();
return 0;
}

в итоге вижу в консоли только done
Отладка показывает, что в этом месте

C++
1
2
3
4
5
  for (int i = 0; i < size; ++i){
            for (int j = 0; j < size; ++j){
                table[i][j]=rand()%10+1;
            }
        }

с элементами массива -члена класса ничего не происходит, там просто адреса.
тоесть не работает ;(

Добавлено через 39 минут
Ошибку нашел, испарвил.



0



Я новичок в C ++, и у меня есть амбиции понять, как работают шаблоны. Итак, я реализовал общий список MyList который может содержать как встроенные примитивные типы, так и указатели. в remove Функция Я хочу различать типы указателей и встроенные модули, чтобы можно было удалить объект за указателем, но оставить встроенные элементы без изменений.

Чтобы различать типы шаблонов, которые могут быть указателями или не указателями, я написал следующие функции, которые прекрасно работают:

// distinguish between pointer and non-pointer type of template variable
template<typename T> bool is_pointer(T t) {
return false;
}

template<typename T> bool is_pointer(T* t) {
return true;
}

В функции списка remove Идея заключалась в том, чтобы проверить указатели и удалить их на всякий случай. Однако оператор delete не компилируется:

template<typename T> void MyList<T>::remove() {
...
if (is_pointer(temp->getContent())) {
// delete object pointer points to
T t = temp->getContent();
cout << t;    // prints out address
// delete t;  // produces compiler error (see below)
}

в main.cpp Я тестирую список класса с различными типами, я вызываю среди других:

MyList<int> mylist;                // with type int
mylist.remove();
mylist.add(3);
// add and remove elements

MyList<string> mylist2;           // with type string
...

MyList<string*> mylist3;          // with type string*
mylist.add(new string("three"));
mylist.remove();

Когда я закомментирую заявление delete t; Я могу убедиться, что поток управления корректен: оператор if вводится только для string* пример. Однако, если я раскомментирую delete В заявлении компилятор жалуется так:

../mylist.h: In member function ‘void MyList<T>::remove() [with T = int]’:
../main.cpp:36:18:   instantiated from here
../mylist.h:124:6: error: type ‘int’ argument given to ‘delete’, expected pointer
../mylist.h: In member function ‘void MyList<T>::remove() [with T = std::basic_string<char>]’:
../main.cpp:71:18:   instantiated from here
../mylist.h:124:6: error: type ‘struct std::basic_string<char>’ argument given to ‘delete’, expected pointer
make: *** [main.o] Error 1

Что я не вижу? Я использую delete утверждение только по указателям, но все же я получаю эти ошибки компилятора. Если я распечатаю t в операторе if это адрес указателя!

1

Решение

Шаблон — это проект, который компилятор использует для фактического создания типов на основе использования проекта. Когда вы используете свой шаблон с int а также string* компилятор на самом деле создаст два варианта MyList, заменяя T фактическим типом. Реализация, которая использует int за T является поддельным, потому что удаление int не имеет смысла. Фактический код, который генерирует компилятор:

int t = temp->getContent();
cout << t;
delete t;

Это неверно, как вы могли понять.

1

Другие решения

Если вы создаете экземпляр шаблона с T = int, ты получаешь:

void MyList::remove() {
if (false) {
T t = temp->getContent();
cout << t;
delete t;
}
}

Даже если кодовый блок никогда не выполняется, он должен быть синтаксически правильным.

0

Я предлагаю использовать C ++ 11 type_traits и auto_ptr, как это

#include <type_traits>
template<typename T> void MyList<T>::remove() {
...
if (is_pointer(T)) {
// delete object pointer points to
T t = temp->getContent();
cout << t;    // prints out address
auto_ptr tempobj(T);
}

Также посмотрите на это Определите, является ли Type указателем в шаблонной функции это может быть полезно, если ваш компилятор не совместим с C ++ 11.

Спасибо
Нирадж Рати

0

Я новичок в C++ и хочу понять, как работают шаблоны. Итак, я реализовал общий список MyList который может содержать как встроенные примитивные типы, так и указатели. в remove Я хочу различать типы указателей и встроенные функции, чтобы можно было удалить объект за указателем, но оставить встроенные функции нетронутыми.

Чтобы различать типы шаблонов, которые могут быть указателями или не указателями, я написал следующие функции, которые отлично работают:

// distinguish between pointer and non-pointer type of template variable
template<typename T> bool is_pointer(T t) {
    return false;
}

template<typename T> bool is_pointer(T* t) {
    return true;
}

В функции списка remove идея заключалась в том, чтобы проверить наличие указателей и удалить их на всякий случай. Однако оператор удаления не компилируется:

template<typename T> void MyList<T>::remove() {
    ...
    if (is_pointer(temp->getContent())) {
        // delete object pointer points to
        T t = temp->getContent();
        cout << t;    // prints out address
        // delete t;  // produces compiler error (see below)
}

В разделе main.cpp Я тестирую класс списка с различными типами, среди прочего я вызываю:

MyList<int> mylist;                // with type int
mylist.remove();
mylist.add(3);
// add and remove elements

MyList<string> mylist2;           // with type string
...

MyList<string*> mylist3;          // with type string*
mylist.add(new string("three")); 
mylist.remove();

Когда я комментирую утверждение delete t; Я могу убедиться, что поток управления правильный: оператор if вводится только для string* пример. Однако, если я раскомментирую delete оператор компилятор жалуется так:

../mylist.h: In member function ‘void MyList<T>::remove() [with T = int]’:
../main.cpp:36:18:   instantiated from here
../mylist.h:124:6: error: type ‘int’ argument given to ‘delete’, expected pointer
../mylist.h: In member function ‘void MyList<T>::remove() [with T = std::basic_string<char>]’:
../main.cpp:71:18:   instantiated from here
../mylist.h:124:6: error: type ‘struct std::basic_string<char>’ argument given to ‘delete’, expected pointer
make: *** [main.o] Error 1

Что я не вижу? я использую delete оператор только для указателей, но все же я получаю эти ошибки компилятора. если я распечатаю t в операторе if это адрес указателя!

  • Forum
  • Beginners
  • Beginning game classes

Beginning game classes

I’ll get right to the point:
I’m trying to make a game sort of like Dwarf Fortress, but a lot less complex. It’s going to be text based, and you’d enter in text commands, and the dwarves would do it. I’ve never really used classes much, so is there anything wrong with what I have below?

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
class Dwarf
{
    int age, Xpos, Ypos, carry;
    string job;
    
    public:
    Dwarf (int, int, int);
    ~Dwarf ();
};

Dwarf::Dwarf (int a, int x, int y) 
{
  age = new int;
  Xpos = new int;
  Ypost = new int;
  *age = a;
  *Xpos = x;
  *Ypos = y;
}

Dwarf::~Dwarf()
 {
  delete age;
  delete job;
  delete Xpos;
  delete Ypos;
  delete carry;
};

Last edited on

Your age, Xpos and Ypos variables aren’t pointers, so you can’t assign them like that. Nor can I think of why you’d need to.

Keep it simple. :-)

1
2
3
4
5
6
Dwarf::Dwarf( int a, int x, int y )
{
   age = a;
   Xpos = x;
   Ypos = y;
}

I’m getting an error for my deconstructer function:

23|error: type ‘int’ argument given to ‘delete’, expected pointer|
24|error: type ‘std::string {aka struct std::basic_string<char>}’ argument given to ‘delete’, expected pointer|

etc.

That’s because you are trying to call delete on a regular int. Remove the delete statements in the destructor.

So… Should anything go in the deconstructor?

I still don’t really understand. They deleted the array, but I shouldn’t delete my ints?

You only use delete when you’ve used new to allocate memory.

Since you don’t need to use new, as shown in my example, then you don’t need to use delete.

Thanks! :)

How would I create multiple instances of the class? For example, if I wanted to add a number of dwarves in game, but I wouldn’t know how many to create until I was playing.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Dwarf
{
    public:
    int age, Xpos, Ypos, carry;
    string job, name;
    Dwarf (string n, int a, int x, int y);
    ~Dwarf ();

    string GetName(){return name;}
    string GetJob(){return job;}
    int GetXpos(){return Xpos;}
    int GetYpos(){return Ypos;}
    int GetCarry(){return carry;}
};

You would use

std::vector

http://www.cplusplus.com/vector

1
2
3
4
std::vector<Dwarf> dwarves;
//whenever you want to add another dwarf:
dwarves.push_back(Dwarf("Name", 10, 32, 24));
//in C++11 it is better to use .emplace_back() for this 

Last edited on

Okay, thanks! :) If I did that and created a vector, how would I call a Dwarf class function like GetName() for any individual dwarf? Could I do that?

They work like arrays. Just use the [] operator:

1
2
3
// 0 is the first dwarf in the vector, 1 is the next one, etc.

dwarves[0].GetName();  // gets the name of the first dwarf 

You can use dwarves.size(); to find out how many dwarves are in your vector.

Ah, thanks! :)

Topic archived. No new replies allowed.

Improve Article

Save Article

  • Read
  • Discuss
  • Improve Article

    Save Article

    Delete is an operator that is used to destroy array and non-array(pointer) objects which are created by new expression.
     

    • Delete can be used by either using Delete operator or Delete [ ] operator
    • New operator is used for dynamic memory allocation which puts variables on heap memory.
    • Which means Delete operator deallocates memory from heap.
    • Pointer to object is not destroyed, value or memory block pointed by pointer is destroyed.
    • The delete operator has void return type does not return a value.

    Here, Below are examples where we can apply delete operator:
    1. Deleting Array Objects: We delete an array using [] brackets.

    CPP

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        int* array = new int[10];

        delete[] array;

        return 0;

    }

    2. Deleting NULL pointer : Deleting a NULL does not cause any change and no error.

    CPP

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        int* ptr = NULL;

        delete ptr;

        return 0;

    }

    3. Deleting pointer with or without value

    CPP

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        int* ptr1 = new int;

        int* ptr2 = new int(20);

        cout << "Value of ptr1 = " << *ptr1 << "n";

        cout << "Value of ptr2 = " << *ptr2 << "n";

        delete ptr1;

        delete ptr2;

        return 0;

    }

    Output: 

    Value of ptr1 = 0
    Value of ptr2 = 20

    4. Deleting a void pointer

    CPP

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        void* ptr;

        delete ptr;

        cout << "ptr deleted successfully";

        return 0;

    }

    Output:  

    ptr deleted successfully

    5. deleting memory dynamically allocated by malloc 

    CPP

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        int* ptr2 = (int*)malloc(sizeof(int));

        delete ptr2;

        cout << "ptr2 deleted successfully";

        return 0;

    }

    Output:  

    ptr2 deleted successfully

    Although above program runs fine on GCC. It is not recommended to use delete with malloc().
    6. Deleting variables of User Defined data types:

    CPP

    #include <bits/stdc++.h>

    using namespace std;

    struct P {

        static void operator delete(void* ptr, std::size_t sz)

        {

            cout << "custom delete for size " << sz <<endl;

            delete (ptr);

        }

        static void operator delete[](void* ptr, std::size_t sz)

        {

            cout << "custom delete for size " << sz <<endl;

            delete (ptr);

        }

    };

    int main()

    {

        P* var1 = new P;

        delete var1;

        P* var2 = new P[10];

        delete[] var2;

    }

    Output:  

    custom delete for size 1
    custom delete for size 18

    Exceptions:
    1. Trying to delete Non-pointer object

    CPP

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        int x;

        delete x;

        return 0;

    }

    Output:  

    error: type ‘int’ argument given to ‘delete’, expected pointer

    2. Trying to delete pointer to a local stack allocated variable. 

    CPP

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        int x;

        int* ptr1 = &x;

        delete ptr1;

        return 0;

    }

    Output

    Runtime error

    Я новичок в C++, и у меня есть стремление понять, как работают шаблоны. Поэтому я внедрил общий список MyList который может содержать как встроенные примитивные типы, так и указатели. В функции remove я хочу различать типы указателей и встроенные модули, поэтому я могу удалить объект за указателем, но оставить встроенные в него нетронутыми.

    Чтобы различать типы шаблонов, которые могут быть указателями или не указателями, я написал следующие функции, которые работают нормально:

    // distinguish between pointer and non-pointer type of template variable
    template<typename T> bool is_pointer(T t) {
        return false;
    }
    
    template<typename T> bool is_pointer(T* t) {
        return true;
    }
    

    В функции списка remove идею было проверить для указателей и удалить их в случае. Однако инструкция delete не компилируется:

    template<typename T> void MyList<T>::remove() {
        ...
        if (is_pointer(temp->getContent())) {
            // delete object pointer points to
            T t = temp->getContent();
            cout << t;    // prints out address
            // delete t;  // produces compiler error (see below)
    }
    

    В main.cpp я тестирую класс списка с различными типами, я вызываю среди других:

    MyList<int> mylist;                // with type int
    mylist.remove();
    mylist.add(3);
    // add and remove elements
    
    MyList<string> mylist2;           // with type string
    ...
    
    MyList<string*> mylist3;          // with type string*
    mylist.add(new string("three")); 
    mylist.remove();
    

    Когда я закомментирую инструкцию delete t; Я могу проверить правильность потока управления: if-statement вводится только для примера string*. Однако, если я раскомментирую инструкцию delete компилятор так жалуется:

    ../mylist.h: In member function ‘void MyList<T>::remove() [with T = int]:
    ../main.cpp:36:18:   instantiated from here
    ../mylist.h:124:6: error: type ‘int argument given to ‘delete, expected pointer
    ../mylist.h: In member function ‘void MyList<T>::remove() [with T = std::basic_string<char>]:
    ../main.cpp:71:18:   instantiated from here
    ../mylist.h:124:6: error: type ‘struct std::basic_string<char> argument given to ‘delete, expected pointer
    make: *** [main.o] Error 1
    

    Что я не вижу? Я использую инструкцию delete только для указателей, но все же я получаю эти ошибки компилятора. Если я напечатаю t в if-statement, это адрес указателя!

    30.12.2019C++, C++ Программы, Результат программы

    Удалить — это оператор, который используется для уничтожения объектов массива и не-массива (указателя), которые создаются новым выражением.

    • Удалить можно использовать с помощью оператора Delete или оператора Delete [].
    • Оператор new используется для динамического выделения памяти, который помещает переменные в динамическую память.
    • Это означает, что оператор Delete освобождает память из кучи.
    • Указатель на объект не уничтожается, значение или блок памяти, на который указывает указатель, уничтожается.

    Здесь, ниже приведены примеры, где мы можем применить оператор удаления:

    1. Удаление объектов массива : мы удаляем массив, используя скобки [].

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        int* array = new int[10]; 

        delete[] array; 

        return 0;

    }

    2. Удаление NULL- указателя : удаление NULL не вызывает никаких изменений и ошибок.

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        int* ptr = NULL;

        delete ptr;

        return 0;

    }

    3. Удаление указателя со значением или без него

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        int* ptr1 = new int

        int* ptr2 = new int(20); 

        cout << "Value of ptr1 = " << *ptr1 << "n";

        cout << "Value of ptr2 = " << *ptr2 << "n";

        delete ptr1;

        delete ptr2;

        return 0;

    }

    Выход:

    Value of ptr1 = 0
    Value of ptr2 = 20
    

    4. Удаление пустого указателя

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        void* ptr;

        delete ptr;

        cout << "ptr deleted successfully";

        return 0;

    }

    Выход :

    ptr deleted successfully
    

    5. удаление памяти, динамически выделяемой malloc

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        int* ptr2 = (int*)malloc(sizeof(int));

        delete ptr2;

        cout << "ptr2 deleted successfully";

        return 0;

    }

    Выход :

    ptr2 deleted successfully
    

    Хотя вышеприведенная программа отлично работает на GCC. Не рекомендуется использовать delete с malloc ().

    6. Удаление переменных пользовательских типов данных :

    #include <bits/stdc++.h>

    using namespace std;

    struct P {

        static void operator delete(void* ptr, std::size_t sz)

        {

            cout << "custom delete for size " << sz <<endl;

            delete (ptr);

        }

        static void operator delete[](void* ptr, std::size_t sz)

        {

            cout << "custom delete for size " << sz <<endl;

            delete (ptr);

        }

    };

    int main()

    {

        P* var1 = new P;

        delete var1;

        P* var2 = new P[10];

        delete[] var2;

    }

    Выход :

    custom delete for size 1
    custom delete for size 18
    

    Исключения :

    1. Попытка удалить объект без указателя

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        int x;

        delete x;

        return 0;

    }

    Выход :

    error: type ‘int’ argument given to ‘delete’, expected pointer
    

    2. Попытка удалить указатель на выделенную переменную локального стека.

    #include <bits/stdc++.h>

    using namespace std;

    int main()

    {

        int x;

        int* ptr1 = &x;

        delete ptr1;

        return 0;

    }

    Выход :

    Runtime error
    

    Рекомендуемые посты:

    • «удалить это» в C ++
    • Как удалить последний элемент из набора в C ++
    • Как удалить последний элемент с карты в C ++
    • удалить и освободить () в C ++
    • Как удалить последний элемент из списка в C ++ STL
    • Как удалить элемент из набора, передав его значение в C ++
    • Удалить элементы в списке C ++ STL
    • Перегрузка операторов New и Delete в c ++
    • Как удалить диапазон значений из набора с помощью итератора
    • Программа для удаления N-й цифры номера
    • операторы new и delete в C ++ для динамической памяти
    • Как удалить диапазон значений из списка с помощью итератора
    • C ++ программа для удаления содержимого двоичного файла
    • Различные способы удаления элементов в std :: map (erase () и clear ())
    • Удалить все неосновные узлы из односвязного списка

    delete () в C ++

    0.00 (0%) 0 votes

    Понравилась статья? Поделить с друзьями:
  • Error type card removed
  • Error type bigserial does not exist
  • Error type access violation
  • Error type 3 error activity class does not exist
  • Error type 0x01