Вы можете удалить динамически выделенную память из отдельной программы? - PullRequest
1 голос
/ 11 октября 2019

Этот вопрос из чистого любопытства. Недавно я узнал, что очень важно удалить пространство памяти, если оно динамически выделяется в куче. Мой вопрос, возможно ли удалить динамически выделенное пространство памяти, используя другую программу C ++ (из той, с которой было создано пространство памяти), если известен адрес области памяти?

Вот пример:

CODE01.CPP

#include <iostream>
using namespace std;

int main() {
    int *a = new int;
    cout << a;
    int foo;
    cin >> foo;  // for blocking the program from closing.
    return 0;
}

Выход для CODE01.CPP (скажем)

0x7c1640

CODE02.CPP

#include <iostream>
using namespace std;

int main() {
    int *a = (int*)0x7c1640;
    delete a;
    return 0;
}

Будет ли это работать? Если я сначала запустите code01.cpp, а затем сразу code02.cpp, удалится ли память в куче?

Ответы [ 3 ]

5 голосов
/ 11 октября 2019

Любая современная ОС создаст отдельное виртуальное адресное пространство для обеих программ. Таким образом, адрес, который вы печатаете в code01.cpp, имеет отношение только к этой программе, и вы не можете получить доступ к адресному пространству из code02.cpp.

Поэтому, чтобы ответить на ваш непосредственный вопрос: выполнение cpp02.cpp не повлияет на состояниепо-прежнему работает cpp01.cpp в любом случае.

4 голосов
/ 11 октября 2019

Одной из задач, назначенных операционным системам, является обеспечение того, что один процесс не может нанести вред другому. Это означает, что один процесс не должен каким-либо образом напрямую влиять на память, используемую другим.

Существует несколько механизмов для этого, но все они опровергают идею

"Если я знаю значение указателя, используемого в , который обрабатывает, тогда я могусделайте что-нибудь с его памятью из этого процессов. "

, потому что именно так ОС и полагает предотвратить .


При этом многие ОС предоставляют специальные каналы (предназначенные для межпроцессного взаимодействия), которые можно использовать для разрешения чего-либо подобного. Но вам придется поработать над этим, а детали зависят от ОС.

2 голосов
/ 11 октября 2019

Краткий ответ для большинства современных операционных систем - нет. Большинство операционных систем используют виртуальную память , что означает, что 0x7c1640 в программе A не обязательно 0x7c1640 в программе B. Для того чтобы это было возможно, вам придется написать собственную ОС для этого без защиты памяти, вВ какой момент любая программа может перезаписать любую другую программу, что является серьезной уязвимостью безопасности.

A связанный вопрос предлагает приведенную ниже схему того, как заняты виртуальные адреса. Каждая программа получает поддельный адрес памяти, который переводит ОС, поэтому каждая программа получает различную кучу и не может взаимодействовать друг с другом напрямую через память, по крайней мере, в общей системе виртуальной памяти.

Process memory allocation

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