Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
-3 / 7 / 2
Регистрация: 10.11.2008
Сообщений: 776
1

Компилятор не видит std::unique_ptr

10.02.2016, 16:26. Показов 2168. Ответов 21
Метки нет (Все метки)

Не создается unique_ptr

C++ (Qt)
1
2
3
4
5
6
7
8
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    std::unique_ptr<int> p;
 
    a.exec();
}
А auto_ptr создается...
Можете привести простейший пример работы с умные указателем (создание, присвоение, копирование, удаление)
0

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

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2016, 16:26
Ответы с готовыми решениями:

Использование std::unique_ptr
Есть в коде подобная конструкция, вылетает исключение на этапе очистки памяти. С чем это может быть...

Отсутствует std::unique_ptr gcc 4.8.1
всем привет , я в С++ начинающий и возникла проблема не работает std::unique_ptr версия...

Копирование объектов std::unique_ptr
привет, столкнулся с такой ситуацией, что вроде как копировать объекты std::unique_ptr запрещено,...

Std::unique_ptr virtual метод
#include &lt;iostream&gt; #include &lt;memory&gt; class Base { public: virtual void f1(); // Virtual...

21
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.02.2016, 16:29 2
Knjagskij, Что значит не создается? Вы его только объявили. Есть умный указатель, который указывает на нулевой указатель. И что?
0
-3 / 7 / 2
Регистрация: 10.11.2008
Сообщений: 776
10.02.2016, 16:42  [ТС] 3
У меня, вообще, qt не видит unuque_ptr, в 5 строке выдает ошибку
0
Любитель чаепитий
3587 / 1687 / 519
Регистрация: 24.08.2014
Сообщений: 5,709
Записей в блоге: 1
10.02.2016, 16:44 4
Knjagskij, А вы нужную библиотеку подключили? Такую как, например, <memory>?
0
Don't worry, be happy
17176 / 10058 / 1936
Регистрация: 27.09.2012
Сообщений: 25,057
Записей в блоге: 1
10.02.2016, 16:53 5
Цитата Сообщение от Knjagskij Посмотреть сообщение
Не создается unique_ptr
1) стандарт C++11, добавьте компилятору ключик (если это gcc, clang) -std=c++11 или -std=c++14,
для более старых версий компилятора, возможно -std=c++0x поможет.
2) #include <memory>
0
-3 / 7 / 2
Регистрация: 10.11.2008
Сообщений: 776
10.02.2016, 17:04  [ТС] 6
Спасибо! А как, вообще, указателю значение присвоить?
0
Любитель чаепитий
3587 / 1687 / 519
Регистрация: 24.08.2014
Сообщений: 5,709
Записей в блоге: 1
10.02.2016, 17:38 7
Knjagskij,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <memory>
 
using namespace std;
 
int main()
{
    int* n = new int(10);
    int* n1 = new int(322);
    unique_ptr<int> ptr(new int(128));
    unique_ptr<int> p(n);
    unique_ptr<int> p1;
    p1 = unique_ptr<int>(n1);
}
0
-3 / 7 / 2
Регистрация: 10.11.2008
Сообщений: 776
10.02.2016, 18:15  [ТС] 8
Так, что ли, нужно работать?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <memory>
 
using namespace std;
 
int main()
{
#include <iostream>
#include <memory>
 
using namespace std;
 
int main()
{
    int *p_ = new int;
    std::unique_ptr<int> p(p_);
    *p_ = 5;
    qDebug() << p;
}
}
Или есть какой-то более красивый способ, где обернул указатель в ум и дальше с умным работаешь?
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
10.02.2016, 18:23 9
Цитата Сообщение от Knjagskij Посмотреть сообщение
есть какой-то более красивый способ
хоть самому написать под себя
Страуструп, например, такие штуки выдумывал даже
C
1
2
3
4
5
6
7
8
9
#define RAII_VARIABLE(vartype,varname,initval,dtor) \
 void _dtor_ ## varname (vartype * v) { dtor(*v); } \
 vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
 
void raiiExample() {
 RAII_VARIABLE(char*, name, (char*)malloc(32), free);
 strcpy(name, "RAII Example" );
 printf("%s\n" , name);
}
а уж в С++ все в ваших руках и голове
1
1495 / 788 / 174
Регистрация: 05.12.2015
Сообщений: 2,363
10.02.2016, 18:34 10
Цитата Сообщение от Knjagskij Посмотреть сообщение
Так, что ли, нужно работать?
C++
1
2
std::unique_ptr<int> p(new int);
std::cout<<*p;
если нужен массив:
C++
1
std::unique_ptr<int, std::default_delete<int[]>> p(new int[N]);
1
Don't worry, be happy
17176 / 10058 / 1936
Регистрация: 27.09.2012
Сообщений: 25,057
Записей в блоге: 1
10.02.2016, 21:21 11
Цитата Сообщение от avgoor Посмотреть сообщение
если нужен массив:
C++
1
std::unique_ptr<int[]> p (new int[N]);
1
-3 / 7 / 2
Регистрация: 10.11.2008
Сообщений: 776
11.02.2016, 09:42  [ТС] 12
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    std::unique_ptr<int[]> p(new int(3));
    p[0] = 5;
    p[1] = 2;
 
    qDebug() << p[1];
}
Ошибка памяти

Добавлено через 17 минут
Решил проблему так:
C++ (Qt)
1
2
3
4
5
6
7
    std::unique_ptr<int[]> p(new int(3));
    p[0] = 5;
    p[1] = 2;
    p[2] = 12;
    p[3] = 4;
 
    qDebug() << p[3];
Почему
C++ (Qt)
1
p[3] = 4;
Здесь работает?

Кстати, как создать многомерный массив с помощью smart-pointers?

Добавлено через 1 минуту
А, вижу, что коды почти одинаковые) Ошибка была вызвана отсутствием a.exec() в Qt, судя по всему
0
Jesus loves me
Эксперт С++
5191 / 3158 / 356
Регистрация: 12.12.2009
Сообщений: 7,983
Записей в блоге: 2
11.02.2016, 10:03 13
Цитата Сообщение от Croessmah Посмотреть сообщение
std::unique_ptr<int[]> p (new int[N]);
стоит сказать, что для shared_ptr такой плюшки нет, там как раз вариант из 10-го поста нужен.

Добавлено через 1 минуту
Цитата Сообщение от Knjagskij Посмотреть сообщение
Ошибка памяти
ошибка в том, что ты выделяешь один int и инициализируешь его значением 3, а используешь его как массив.

Добавлено через 1 минуту
Цитата Сообщение от Knjagskij Посмотреть сообщение
Решил проблему так:
не решил, просто по несчастливой случайности оно не упало.
0
-3 / 7 / 2
Регистрация: 10.11.2008
Сообщений: 776
11.02.2016, 10:26  [ТС] 14
C++ (Qt)
1
std::unique_ptr<int, std::default_delete(int[])> up(new int[3]);
Выдает ошибку. А что делает defaul_delete? На английском не понял, какое-то "разрушение политики"...

Добавлено через 1 минуту
А так:
C++ (Qt)
1
2
3
4
    std::unique_ptr<int[]> up(int[3]);
    up[0] = 5;
    up[1] = 2;
    up[2] = 12;
Из-за присвоений не компилируется
0
1495 / 788 / 174
Регистрация: 05.12.2015
Сообщений: 2,363
11.02.2016, 11:24 15
Цитата Сообщение от Knjagskij Посмотреть сообщение
std::unique_ptr<int, std::default_delete(int[])> up(new int[3]);
C++
1
std::unique_ptr<int, std::default_delete<int[]>> up(new int[3]);
Вы, хоть, ctrl+C ctrl+V без ошибок сделать можете?
0
-3 / 7 / 2
Регистрация: 10.11.2008
Сообщений: 776
11.02.2016, 11:37  [ТС] 16
C++ (Qt)
1
2
3
4
    std::unique_ptr<int, std::default_delete<int[]> > up(new int[3]);
    up[0] = 5;
    up[1] = 2;
    up[2] = 12;
Не присваивает значения

Добавлено через 22 секунды
Не компилируется
0
Jesus loves me
Эксперт С++
5191 / 3158 / 356
Регистрация: 12.12.2009
Сообщений: 7,983
Записей в блоге: 2
11.02.2016, 11:54 17
вот так попробуй
C++
1
2
std::unique_ptr<int[]> up (new int[3]);
up[0] = 123;
это разные типы unique_ptr
0
-3 / 7 / 2
Регистрация: 10.11.2008
Сообщений: 776
11.02.2016, 12:00  [ТС] 18
Спасибо, так работает, а чем отличается второй unique_ptr? И что делает default_delete?
0
Don't worry, be happy
17176 / 10058 / 1936
Регистрация: 27.09.2012
Сообщений: 25,057
Записей в блоге: 1
11.02.2016, 12:03 19
Цитата Сообщение от Kastaneda Посмотреть сообщение
стоит сказать, что для shared_ptr такой плюшки нет, там как раз вариант из 10-го поста нужен.
Стоит сказать, что для обычного указателя и такого варианта нет.
Я просто не понял, каким бококом тут shared_ptr нарисовался

Добавлено через 49 секунд
Цитата Сообщение от Knjagskij Посмотреть сообщение
И что делает default_delete?
http://www.cplusplus.com/refer... lt_delete/
0
Jesus loves me
Эксперт С++
5191 / 3158 / 356
Регистрация: 12.12.2009
Сообщений: 7,983
Записей в блоге: 2
11.02.2016, 12:05 20

Не по теме:

Цитата Сообщение от Croessmah Посмотреть сообщение
Я просто не понял, каким бококом тут shared_ptr нарисовался
ну ты показал какую-то штуку, значит должен рассказать, что она не везде работает :)



Добавлено через 49 секунд
Цитата Сообщение от Knjagskij Посмотреть сообщение
а чем отличается второй unique_ptr
разные специализации шаблона. Можешь открыть код, посмотреть.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2016, 12:05

Копирование std::unique_ptr в структуре
Есть структуры и vector struct myStruct { int a; int b; void* param; }; struct sSetup {...

Шаблонные аргументы конструктора std::unique_ptr
Если я пишу код std::unique_ptr&lt;int, void(*)(int*)&gt; myPtr_5(new int, (int* p) {delete p; });...

Не срабатывает move конструктор std::unique_ptr
Всем привет! Битый час не пойму почему в списке захвата компилятор ругается на удаленный копирующий...

Компилятор не понимает std::
#include &lt;iostream.h&gt; #include &lt;cstdlib.h&gt; #include &lt;math.h&gt; int main() { double a; int i; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.