Удалить поведение оператора при вызове массива в C ++? - PullRequest
0 голосов
/ 24 мая 2018

У меня есть следующая строка кода.

Пример кода 1

char * arr = new char[10];
arr++;
delete arr;

Пример кода 2

char * arr = new char[10];
delete arr;

У меня есть два примера кода.Пример кода один падает при удалении, а пример кода 2 работает нормально.Существует только разница arr ++ .Что именно происходит в этих двух примерах кода.Кто-нибудь может объяснить?

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

C ++ не поддерживает удаление элементов в массиве, поскольку массив C является зарезервированным непрерывным блоком памяти.Возможно, вы ищете векторов C ++ .

. С ними вы можете сделать что-то вроде: (Модифицированный пример кода по ссылке)

#include <iostream>
#include <vector>

int main()
{
    // Create a vector containing integers
    std::vector<int> v = {7, 5, 16, 8, 6, 3, 5, 6};

    // Add two more integers to vector
    v.push_back(25);
    v.push_back(13);

    // Iterate and print values of vector
    for(int n : v) {
        std::cout << n << '\n';
    }

    v.erase(3);
    v.erase(5, 6);

    for(int n : v) {
        std::cout << n << '\n';
    }
}

Ссылка конкретно оVisual C ++ можно найти на https://msdn.microsoft.com/en-us/library/9xd04bzs.aspx#vector__erase.

0 голосов
/ 24 мая 2018

правильный способ удаления массива распределений,

char * arr = new char [10];delete [] arr;

// когда вы сделаете это, один элемент не будет удален и приведет к утечке

char * arr = new char[10];
arr++ 
delete[] arr;
0 голосов
/ 24 мая 2018

Невозможно удалить один элемент, поскольку delete необходимо использовать для удаления той же памяти, которая была выделена.

Это сбой, потому что указатель, который возвращает new, должен быть тем же, который используется для вызова delete.

Увеличение указателя и использование этого означает, что программа больше не видит другую бухгалтерскую информацию (возможно, сохраненную непосредственно перед указателем, который new вернул)

Также вы должны использовать delete[]удалить массив.По этой причине следующее поведение не определено:

char * arr = new char[10];
delete arr;

Должно быть:

char * arr = new char[10];
delete[] arr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...