Что это за указатель и печать кода памяти? Я не знаю, печатает ли он мусор или как распечатать нужное мне значение - PullRequest
0 голосов
/ 14 июля 2020

Это фрагмент кода, который я взял из более крупного. Мне нужно выяснить, является ли то, что я печатаю, мусором, и как изменить его, чтобы он печатал нужное мне значение. Мне нужно, чтобы он напечатал значение int id вместо того, что он печатает. В этом прогоне результат был 10813776, и он, конечно же, изменяется всякий раз, когда я меняю код или перезапускаю DevC ++.

Код:

#include <iostream>
#include <memory> //Memory allocation (malloc)

using namespace std;

int main(){
    int id = 0;
    int nMemory = 0;
    int * pMemory;
    pMemory = (int *) malloc(20 * sizeof(int));
    
    while(id < 20){
        if (pMemory != NULL){
            cout << "Numbers in memory: " << endl;
            pMemory = new int[id];
            nMemory = *pMemory;
            cout << nMemory << endl;
        }
        id++;
    }
    delete pMemory;
    
    return 0;
}

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Этот код вызывает утечку блоков памяти, которые вы выделяете с помощью malloc() и new[].

Вы malloc() блок памяти и назначаете его адрес pMemory, затем вы меняете pMemory для указания на разные адреса памяти, которые выделены с помощью new[]. Таким образом, вы теряете возможность free() памяти malloc() (вы даже не пытаетесь вызвать free()).

И этот код не освобождает память, выделенную new[] правильно . Память, выделенная с помощью new[], должна быть освобождена с помощью delete[], а не delete. Хуже того, вы звоните new[] 20 раз в al oop, но звоните delete только один раз после l oop. Итак, у вас утечка 19 блоков new[] ed памяти и неопределенное поведение освобождение 1 блока.

Теперь, чтобы ответить на ваш вопрос, код распечатывает мусор, потому что память, которую вы выделяете с помощью new[], равна неинициализированной , поэтому данные, которые вы пытаетесь распечатать из этой памяти, содержат неопределенных значений.

2 голосов
/ 14 июля 2020
pMemory = new int[id];
nMemory = *pMemory;

Первая строка заменяет массив, который вы malloc -ed, на новый неинициализированный, а затем пытается прочитать из первого слота этого нового массива. Вы не должны напрямую назначать pMemory; возможно, для pMemory[someIndex], но не для самого pMemory.

Вы пытаетесь читать из массива pMemory и назначать его nMemory? Если это так, измените строки выше на это:

nMemory = pMemory[id];

Весь ваш l oop должен выглядеть примерно так:

if (pMemory != NULL) {
    cout << "Numbers in memory: " << endl;
    while(id < 20) {
        nMemory = pMemory[id];
        cout << nMemory << endl;
        id++;
    }
}

Или, используя другие идиоматические выражения c for l oop:

if (pMemory != NULL) {
    cout << "Numbers in memory: " << endl;
    for (int i = 0; i < 20; i++) {
        cout << pMemory[i] << endl;
    }
}

(Вам также нужно будет инициализировать массив где-то над этим l oop. Я предполагаю, что вы делаете это в своем реальном коде, но если нет: опубликованный вами код выделяет массив с malloc(), но не устанавливает для элементов полезные значения. Убедитесь, что вы установили что-то значимое, прежде чем пытаться прочитать и распечатать их.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...