Удаление элемента из вектора целых числе. Как исправить?
.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 Метки нет (Все метки)
Всем привет! вот код
ОШИБКИ: Всем кто откликнется огромное спасибо
__________________
0 |
|
Enfernuz 22 / 22 / 2 Регистрация: 11.04.2011 Сообщений: 67 |
||||||||
|
07.09.2011, 23:18 |
2 |
|||||||
|
у вас поле-член класса int* table, а в конструкторе вы объявляете локальный указатель int** table. В строке 25 компилятор оперирует с указателем int* table (поле-член класса), а не с локальным указателем int** table.
В деструкторе код такой:
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. Добавлено через 4 минуты
будет приводить не к инициализации указателя-члена класса, а к инициализации локального экземпляра указателя типа int** (имеющего смысл только в теле функции и больше нигде).
1 |
|
Wolf6969 0 / 0 / 0 Регистрация: 07.09.2011 Сообщений: 15 |
||||||||
|
08.09.2011, 00:45 [ТС] |
5 |
|||||||
|
Я вьехал!!! Спасибо за подробное обьяснение. Без последней фразы не понял бы) Еще раз благодарен. Добавлено через 21 минуту
в итоге вижу в консоли только done
с элементами массива -члена класса ничего не происходит, там просто адреса. Добавлено через 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?
|
|
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. 
|
|
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.
|
|
You would use
std::vector
http://www.cplusplus.com/vector
|
|
Last edited on
Okay, thanks! 
They work like arrays. Just use the [] operator:
|
|
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
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
