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

Как обнулить указатель на одну ячейку в динамически-выделенной памяти? - C++

Восстановить пароль Регистрация
 
OasisKharkov
1 / 1 / 0
Регистрация: 28.07.2012
Сообщений: 35
02.07.2014, 01:16     Как обнулить указатель на одну ячейку в динамически-выделенной памяти? #1
Выделю память под 10 элементов:
C++
1
int* p = new int[10];
Наполняю значениями:
C++
1
2
3
4
for(int i = 0; i<10; i++)
            {
                p[i] = i;
            }
Можно ли обнулить указатель, например для последнего элемента в этом массиве?
Что-то типа такого:
C++
1
p[9] = nullptr;
но пишет, что в операторе разные значения стоят по обе стороны от оператора присваивания.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.07.2014, 01:16     Как обнулить указатель на одну ячейку в динамически-выделенной памяти?
Посмотрите здесь:

C++ Как можно узнать размер выделенной динамической памяти, на которую ссылается указатель a?
C++ Как вставить одну и ту же картинку в последнюю ячейку каждого рядка StringGrid
C++ Как добавить новой динамической памяти к уже выделенной
C++ Как уменьшить размер выделенной памяти
Классы. Объявить массив динамически и сделать указатель на объект в динамической памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jewbacabra
1787 / 1502 / 538
Регистрация: 24.04.2014
Сообщений: 4,207
02.07.2014, 01:20     Как обнулить указатель на одну ячейку в динамически-выделенной памяти? #2
OasisKharkov, для начала нужно определиться что все-таки хочется получить.
Цитата Сообщение от OasisKharkov Посмотреть сообщение
но пишет, что в операторе разные значения стоят по обе стороны от оператора присваивания.
И правильно пишет, p[9] - это целое число, а nullptr - указатель
OasisKharkov
1 / 1 / 0
Регистрация: 28.07.2012
Сообщений: 35
02.07.2014, 01:30  [ТС]     Как обнулить указатель на одну ячейку в динамически-выделенной памяти? #3
Да, я это понимаю.
Но задача такова, я делаю что-то типа контейнера CArray на базе шаблончика,
допустим у меня в нем 10 элементов, я, например, удаляю пятый элементы, остальные элементы смещаю на один влево, чтобы не было пустых позиций, но у меня остается 10-ая позиция, которая по сути не нужна, и было бы не плохо, чтобы в этой позиции указатель указывал на NULL:
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
#include <assert.h>
 
template <typename T>
class CArray
{
    int m_size;
    int m_count;
    T* p;
 
public:
    
    CArray(int size) : m_size(size) 
    {
        p = new T[size];
        m_count = 0;
    }
 
    ~CArray()
    {
        delete [] p;
    }
 
    bool Empty()
    {
        if (m_count) return false;
        return true;
    }
 
    int Count()
    {
        return m_count;
    }
 
    bool Full()
    {
        if (m_count == m_size) return true;
        return false;
    }
 
    void Add(const T& elem)
    {
        if(!Full())
        {
            int i = m_count;
            p[i] = elem;
            m_count++;
        }
        else cout << "Array is Full!\n";
    }
 
    void Remove(int index)
    {
        if(!Empty())
        {
            for(int i = index; i<m_count; i++)
            {
                p[i] = p[i+1];
            }
            
            m_count--;          
        }
        else cout << "Array is Empty!\n";
    }
 
    T& operator[](int index) const
    {
        int pos = index;
        assert (pos >= 0 && pos < m_count);
        return p[pos];
    }
};
Jewbacabra
1787 / 1502 / 538
Регистрация: 24.04.2014
Сообщений: 4,207
02.07.2014, 01:39     Как обнулить указатель на одну ячейку в динамически-выделенной памяти? #4
OasisKharkov,
Цитата Сообщение от OasisKharkov Посмотреть сообщение
но у меня остается 10-ая позиция, которая по сути не нужна, и было бы не плохо, чтобы в этой позиции указатель указывал на NULL
в этой позиции никакого указателя нет, следовательно и обнулять нечего
OasisKharkov
1 / 1 / 0
Регистрация: 28.07.2012
Сообщений: 35
02.07.2014, 01:41  [ТС]     Как обнулить указатель на одну ячейку в динамически-выделенной памяти? #5
Ага, указатель есть только на начало выделяемой памяти, в данном случае на p?
И деструктор лучше так сделать?
C++
1
2
3
4
5
~CArray()
{
    delete [] p;
    p = nullptr;
}
Jewbacabra
1787 / 1502 / 538
Регистрация: 24.04.2014
Сообщений: 4,207
02.07.2014, 01:47     Как обнулить указатель на одну ячейку в динамически-выделенной памяти? #6
Цитата Сообщение от OasisKharkov Посмотреть сообщение
Ага, указатель есть только на начало выделяемой памяти, в данном случае на p?
да
Цитата Сообщение от OasisKharkov Посмотреть сообщение
И деструктор лучше так сделать?
смысла в присваивании p = nullptr нет, так как деструктор вызывается при уничтожении объекта, после чего p уже будет не доступен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2014, 11:48     Как обнулить указатель на одну ячейку в динамически-выделенной памяти?
Еще ссылки по теме:

Обнулить кусок памяти (выделенной под указатели) по быстрому C++
Ошибка при удалении динамически выделенной памяти C++
C++ Мусор в памяти, выделенной динамически

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.07.2014, 11:48     Как обнулить указатель на одну ячейку в динамически-выделенной памяти? #7
Цитата Сообщение от Jewbacabra Посмотреть сообщение
nullptr - указатель
Не совсем так. nullptr - это ключевое слово, которое представляет pointer literal типа std::nullptr_t. Данный тип может быть неявно преобразован в указатель на любой тип.
Yandex
Объявления
02.07.2014, 11:48     Как обнулить указатель на одну ячейку в динамически-выделенной памяти?
Ответ Создать тему
Опции темы

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