Удаление элемента из вектора целых числе. Как исправить?
.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! 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:
|
|
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