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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Zla9_Kolu4ka
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 398
#1

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

03.03.2014, 21:32. Просмотров 276. Ответов 8
Метки нет (Все метки)

Читаю уроки по 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++
Сформировать из значений массива другой массив, расположив в нем сначала цифры, затем – буквы, затем - символы, не являющихся ни буквами, ни цифрами C++
Даны 100 чисел. Напечатать сначала все отрицательные из них, а затем все остальные C++
delete[] не освобождает память? C++
Указатель куда указывает? C++
C++ Узнать указывает ли указатель
C++ Указатель указывает на несуществующую переменную, но выводит значение
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
6112 / 5715 / 1849
Регистрация: 18.12.2011
Сообщений: 14,599
Завершенные тесты: 1
03.03.2014, 21:42     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #2
Я вижу всего одну пользу.
static для функции позволяет объявить функцию,
локализованную в том файле, где она объявлена.
В другой файл ее не получить.
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
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
6112 / 5715 / 1849
Регистрация: 18.12.2011
Сообщений: 14,599
Завершенные тесты: 1
03.03.2014, 22:05     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #5
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
void* pointer
Означает, что указатель не имеет типа.
Поэтому в качестве параметра можно передавать любой указатель.
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
03.03.2014, 22:05     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #6
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
void* pointer это как понимать?
Это указатель на неопределенный тип.
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
03.03.2014, 22:09     Программа сначала перезаписывает 100 байт, на которые указывает указатель, а затем освобождает память #7
Какие типы можно ему присваивать определяют правило автоматического преобразования указателей С++.
Это могут быть указатели на объекты, либо указатели на начало последовательности объектов или же nullptr.
Указатели на функции, методы, члены класса в этот список не входят.
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 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++ Как освобождает память STL (на простом примере)
C++ Освобождает ли память процесса менеджер памяти Windows?
Как создать копию объекта на который указывает указатель C++
Разработать программу, которая динамически выделяет 100 блоков памяти по 1000 байт каждый и освобождает их C++
C++ Указатель не указывает на CHAR

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

Или воспользуйтесь поиском по форуму:
DrOffset
6817 / 4028 / 924
Регистрация: 30.01.2014
Сообщений: 6,847
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 байт, на которые указывает указатель, а затем освобождает память
Ответ Создать тему
Опции темы

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