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

Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память - C++

Восстановить пароль Регистрация
 
Zla9_Kolu4ka
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 398
03.03.2014, 21:32     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #1
Читаю уроки по C++ на форуме, почему то автор не хочет все нормально писать, в гугле ничего нормального не нашел, вот

зачем в этой функции
static void operator delete
нужен static??

И что значит в этой же функции void* pointer??

Краткое описание:
Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память, используя для этого функцию библиотеки этапа выполнения free
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
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
using namespace std;
 
 
static void operator delete(void* pointer){
    char* data = (char*) pointer;
    int i;
    for (i = 0; i < 100; i++) 
        data[i] = 0;
    cout << "Secret v bezopasnosty!" << endl;
    free(pointer);
}
 
    
void main(void){
    char* pointer = new char[100];
    strcpy(pointer, "Secrety moey kompaniy");
    delete pointer;
 
    char ch = getchar();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2014, 21:32     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память
Посмотрите здесь:

дано 100 чисел, сначала вывести все отрицательные а затем все остальные C++
Даны 100 чисел. Напечатать сначала все отрицательные из них, а затем все остальные C++
delete[] не освобождает память? C++
Из массива JJ(100) в массив NN(100) перенести числа (элементы массива) сначала нечетные, а затем четные. C++
C++ Получить новый массив, в котором сначала идут положительные числа, затем нулевые, затем отрицательные исходного
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,159
Завершенные тесты: 1
03.03.2014, 21:42     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #2
Я вижу всего одну пользу.
static для функции позволяет объявить функцию,
локализованную в том файле, где она объявлена.
В другой файл ее не получить.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,588
03.03.2014, 21:51     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #3
Вообще static у глобальных имен отключает внешнее связывание.
Однако в этом случае такое вообще нельзя делать, ибо:
3.7.4.2/1
Deallocation functions shall be class member functions or global functions; a program is ill-formed if deallocation functions are declared in a namespace scope other than global scope or declared static in global
scope
Добавлено через 1 минуту
Цитата Сообщение от zss Посмотреть сообщение
Я вижу всего одну пользу.
Это не польза, это был бы ад.
Zla9_Kolu4ka
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 398
03.03.2014, 21:57  [ТС]     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #4
void* pointer это как понимать?
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,159
Завершенные тесты: 1
03.03.2014, 22:05     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #5
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
void* pointer
Означает, что указатель не имеет типа.
Поэтому в качестве параметра можно передавать любой указатель.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,588
03.03.2014, 22:05     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #6
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
void* pointer это как понимать?
Это указатель на неопределенный тип.
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,588
03.03.2014, 22:09     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #7
Какие типы можно ему присваивать определяют правило автоматического преобразования указателей С++.
Это могут быть указатели на объекты, либо указатели на начало последовательности объектов или же nullptr.
Указатели на функции, методы, члены класса в этот список не входят.
castaway
Эксперт С++
4841 / 2980 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
03.03.2014, 22:21     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #8
Функция main должна возвращать значение типа int. Это первая ошибка.
Перегруженный оператор delete нельзя объявить со спецификатором static. Это вторая.
А вообще, static для функций означает внутреннее связывание, т.е. её (функцию/оператор) нельзя увидеть извне.
Там, откуда вы взяли этот код, скорее всего об этом упомянается..
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2014, 22:34     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память
Еще ссылки по теме:

C++ Программа про файлы (Записать построчно в другой файл сначала элементы, находящиеся над главной диагональю, затем...)
Вывести на экран сначала цифры, затем буквы, затем остальные символы исходной строки C++
C++ Освобождает ли память процесса менеджер памяти Windows?

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

Или воспользуйтесь поиском по форуму:
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,588
03.03.2014, 22:34     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #9
А также, нельзя выделять память встроенным оператором, а освобождать переопределенным
Кроме того, для массивов нужно переопределять operator delete[], а не delete
Использование std::cout c надписью "Secret v bezopasnosty!" выглядит особенным издевательством, с учетом того, что std::cout потенциально бросает исключение, в то время как:
3.7.4.2/2
If a deallocation function terminates by throwing an exception, the behavior is undefined.
Не знаю что это за учебник, но лучше его выбросить. А лучше сжечь.
Yandex
Объявления
03.03.2014, 22:34     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память
Ответ Создать тему
Опции темы

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