Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174

Почему C++ программа не удаляет саму себя?

21.11.2015, 18:22. Показов 1969. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется следующий код (файл 01del.cpp):

C++
1
2
3
4
5
6
7
#include <windows.h>
using namespace std;
int main()
{
system("del /q "D:\\01del.exe"");
return 0;
}
При запуске бинарника 01del.exe в консоли выдаётся сообщение:
Отказано в доступе.
Однако, если создать файл 01del.bat, содержащий
Windows Batch file
1
2
@echo off
del /q "D:\01del.bat"
то при его запуске он сам себя успешно удалит.

Почему же C++ программа не удаляет саму себя?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.11.2015, 18:22
Ответы с готовыми решениями:

Перемножить матрицу на саму себя
Подскажите пожалуйста, как можно реализовать эту задачу: Нужно будет перемножить матрицу на саму себя. Вот пример: Матрица 1: 0 A B ...

Зачем функция вызывает саму себя?
#include &lt;stdio.h&gt; #include &lt;vector&gt; int g; bool used; int n, m; //поясните мне эту функцию. void dfs(int...

Непонятно почему ведёт себя так программа
Задачка: //На шахматной доске 8х8 расположены три фигуры: ферзь, ладья и конь. //Требуется определить количество пустых полей...

21
 Аватар для Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
21.11.2015, 18:27
Лучший ответ Сообщение было отмечено watersoda как решение

Решение

Потому, что при запуске .bat файла он весь выгружается в консоль, и не контактирует с файлом который вы запустили с пк, следовательно файл на пк удалить можно.
Однако если вы запускаете .exe файл, и пробуете его удалить пока он включен, пк откажет вам в доступе, т.к. процесс и файл связаны.
Приведу аналогию на человеке который хочет съесть сам себя (О_о упароло).
Если человека клонировать (аналогично запуск .bat) то человек может съесть себя изначального, а клон умрет после завершения программы
А если человека не клонировать, то он съесть себя не сможет(Вот это поворот)
6
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174
21.11.2015, 18:29  [ТС]
почему-то С++ код сохраняется некорректно - в строке system("del /q "D:\\01del.exe"");

перед вторыми двойными кавычками и после .exe должен быть знак \.
0
 Аватар для Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
21.11.2015, 18:30
это служебный знак, поставьте вместо него \U005C (это код этого слеша на UTF8)
0
21.11.2015, 18:31

Не по теме:

Fenix78563, аналогия доставляет :)

0
 Аватар для Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
21.11.2015, 18:35
Попробуйте в код перед удалением добавить строку:
C++
1
Application::Exit();
хотя по идее после этого шага программа уже ничего не делает

Добавлено через 1 минуту
_Ivana,
0
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174
21.11.2015, 18:47  [ТС]
Добавил, при компиляции получил сообщение:
error: 'Application' has not been declared|
0
 Аватар для Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
21.11.2015, 18:50
Это потому, что я затупил. Это метод из windows forms
0
 Аватар для Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
21.11.2015, 18:54
создайте батник в котором будет лежать инструкция по удалению программы, и вклейте его перед закрытием программы, если добавить в батник отсрочку то должно получиться
0
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174
21.11.2015, 18:57  [ТС]
А как в батник добавить отсрочку?
0
 Аватар для Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
21.11.2015, 19:02
очень дебильный вариант но железный
C++
1
ping -n 1 -w 100000 192.168.254.254 >nul
пинг не существующего ip длится 100 сек

Добавлено через 49 секунд
C++
1
2
3
4
5
TStringList *List = new TStringList();  //создает сущность для текста
List->Strings[0]="что будет в первой строке";
List->Strings[1]="что будет во второй строке";  //скорее всего это не нужно. Но обычно можно команду Pause вписать
List->SaveToFile("C:\\1.bat");
delete List;
кстати так можно создать батник прямо в коде программы

Добавлено через 1 минуту
Bash
1
TIMEOUT [/T] 50 [/NOBREAK]
это еще вариант отсрочки
уже управляемый
1
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174
21.11.2015, 21:10  [ТС]
Цитата Сообщение от Fenix78563 Посмотреть сообщение
TStringList *List = new TStringList(); *//создает сущность для текста
List->Strings[0]="что будет в первой строке";
List->Strings[1]="что будет во второй строке"; *//скорее всего это не нужно. Но обычно можно команду Pause вписать
List->SaveToFile("C:\\1.bat");
delete List;
error: 'TStringList' was not declared in this scope|
error: 'List' was not declared in this scope|
error: expected type-specifier before 'TStringList'|
error: expected ';' before 'TStringList'|
error: type '<type error>' argument given to 'delete', expected pointer|
0
48 / 48 / 6
Регистрация: 24.12.2009
Сообщений: 532
21.11.2015, 21:15
Цитата Сообщение от Fenix78563 Посмотреть сообщение
удалить пока он включен, пк откажет вам в доступе
Наверно не ПК, а Windows откажет.

Что, если попробовать сначала выгрузить прогу из "запущенных процессов"? По идее, Windows после этого возражать не станет
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.11.2015, 21:19
Это для Builder пример.
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
21.11.2015, 22:08
watersoda, Если вопрос про винду, то в процесс работы собери cmd/bat файл передай ему путь к exe. Потом отдельным потоком запусти его, и после завершения работы программы он сотрет весь мусор и себя!
0
 Аватар для Fenix78563
165 / 11 / 4
Регистрация: 17.11.2015
Сообщений: 92
22.11.2015, 12:13
watersoda, А вы на чем пишете?
0
 Аватар для Mesteriis
599 / 237 / 69
Регистрация: 08.08.2015
Сообщений: 1,637
22.11.2015, 20:28
Fenix78563, ))))) по коду не видно???
0
4 / 4 / 0
Регистрация: 04.04.2015
Сообщений: 174
23.11.2015, 19:23  [ТС]
Цитата Сообщение от Fenix78563 Посмотреть сообщение
watersoda, А вы на чем пишете?
CodeBlocks + MinGW.

Добавлено через 21 час 30 минут
Обнаружил следующее:


В Windows XP timeout не является внутренней или внешней командой, исполняемой программой или пакетным файлом.

Привёл программу к следующему виду:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <windows.h>
#include <string>
#include <vector>
#include <fstream>
#include <iomanip>
using namespace std;
int main()
{
vector<string> tb;
tb.push_back("@echo off");
tb.push_back("del /q 01del.exe");
for(vector<string>::iterator kt = tb.begin(); kt != tb.end(); ++kt)
{
ofstream out("test.bat", ios::out | ios::app);
out << *kt << endl;
out.close();
}
system("test.bat");
return 0;
}
Снова получил отказ в доступе.

Возникла такая мысль: C++ программа в данном случае завершится только после выполнения system("test.bat");
поэтому при попытке выполнить del /q 01del.exe опять повторится ситуация с невозможностью удалить файл, пока не завершён связанный с ним процесс.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
23.11.2015, 19:49
Как ни странно, бинарник во время своей работы может сам себя переименовать. Однако удалить переименованный файл во время работы - нельзя.
1
23.11.2015, 23:38

Не по теме:

Цитата Сообщение от Байт Посмотреть сообщение
Как ни странно
чего тут странного. Он сам свое имя знать не обязан, оно ему (это имя) не надо. Оно нужно ОС, а не себе любимому. Оно же не внутри бинарника хранится, а вне бинарника для связи с ним. Изменения этого имени внутренности бинарника не затрагивают и сам бинарник в целом не затрагивают вообще. А удаление бинарника - покушение на его внутренние органы (печень там, почки, сердце..)
очень обычная логика.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.11.2015, 23:38
Помогаю со студенческими работами здесь

Функция должна принять указатель на саму себя
не рекурсия. (ошибка в названии) Функция должна принять указатель на саму себя. моя неверная попытка имеет вид int myfunc(int...

Почему программа себя странно ведет: зацикливается после ввода значений?
Зацикливается после воода значений. Подскажите пожалуйста в чем может быть проблема. #include &lt;fstream&gt; #include...

Нюансы работы с массивами: почему программа ведёт себя не так, как ожидается?
// ConsoleApplication20.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include...

Нюансы работы с оператором ветвления if else: почему программа ведёт себя не так, как ожидается?
Имеется код: int a; char q; for (;;) { cout &lt;&lt; &quot;Введите число: &quot;; cin &gt;&gt; a;

Нюансы работы с оператором ветвления if else: почему программа ведёт себя не так, как ожидается?
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; void check_weekday(string day) { if (day == &quot;Понедельник&quot; || day ==...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru