Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Zla9_Kolu4ka
2 / 2 / 1
Регистрация: 28.08.2013
Сообщений: 414
1

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

03.03.2014, 21:32. Просмотров 346. Ответов 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();
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2014, 21:32
Ответы с готовыми решениями:

Разработать программу, которая динамически выделяет 100 блоков памяти по 1000 байт каждый и освобождает их
Всем привет. Подкинули на учебе вот такое задание - Напишите программу, которая...

Функция, принимающая указатель и число байт и выделяющая память под указатель
Здравствуйте. Задача легкая, но почему-то завис Нужно написать функцию,...

Из массива JJ(100) в массив NN(100) перенести числа (элементы массива) сначала нечетные, а затем четные.
Из массива JJ(100) в массив NN(100) перенести числа (элементы массива) сначала...

Даны 100 чисел. Напечатать сначала все отрицательные из них, а затем все остальные
Даны 100 чисел. Напечатать сначала все отрицательные из них, а затем все...

delete[] не освобождает память?
Приветствую! Такая проблема - имеется функция которая должна заменить строку...

8
zss
Модератор
Эксперт С++
7765 / 7001 / 4395
Регистрация: 18.12.2011
Сообщений: 18,514
Завершенные тесты: 1
03.03.2014, 21:42 2
Я вижу всего одну пользу.
static для функции позволяет объявить функцию,
локализованную в том файле, где она объявлена.
В другой файл ее не получить.
0
DrOffset
9509 / 5109 / 1256
Регистрация: 30.01.2014
Сообщений: 8,316
03.03.2014, 21:51 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 Посмотреть сообщение
Я вижу всего одну пользу.
Это не польза, это был бы ад.
1
Zla9_Kolu4ka
2 / 2 / 1
Регистрация: 28.08.2013
Сообщений: 414
03.03.2014, 21:57  [ТС] 4
void* pointer это как понимать?
0
zss
Модератор
Эксперт С++
7765 / 7001 / 4395
Регистрация: 18.12.2011
Сообщений: 18,514
Завершенные тесты: 1
03.03.2014, 22:05 5
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
void* pointer
Означает, что указатель не имеет типа.
Поэтому в качестве параметра можно передавать любой указатель.
0
DrOffset
9509 / 5109 / 1256
Регистрация: 30.01.2014
Сообщений: 8,316
03.03.2014, 22:05 6
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
void* pointer это как понимать?
Это указатель на неопределенный тип.
0
DrOffset
9509 / 5109 / 1256
Регистрация: 30.01.2014
Сообщений: 8,316
03.03.2014, 22:09 7
Какие типы можно ему присваивать определяют правило автоматического преобразования указателей С++.
Это могут быть указатели на объекты, либо указатели на начало последовательности объектов или же nullptr.
Указатели на функции, методы, члены класса в этот список не входят.
0
castaway
Эксперт С++
4937 / 3042 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
03.03.2014, 22:21 8
Функция main должна возвращать значение типа int. Это первая ошибка.
Перегруженный оператор delete нельзя объявить со спецификатором static. Это вторая.
А вообще, static для функций означает внутреннее связывание, т.е. её (функцию/оператор) нельзя увидеть извне.
Там, откуда вы взяли этот код, скорее всего об этом упомянается..
0
DrOffset
9509 / 5109 / 1256
Регистрация: 30.01.2014
Сообщений: 8,316
03.03.2014, 22:34 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.
Не знаю что это за учебник, но лучше его выбросить. А лучше сжечь.
1
03.03.2014, 22:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2014, 22:34

Вывести на экран сначала цифры, затем буквы, затем остальные символы исходной строки
Вывести на экран сначала цифры, затем буквы, затем остальные символы исходной...

Освобождает ли память процесса менеджер памяти Windows?
Если моя программа допускает кучу memory leaks - ов, то после закрытия процесса...

Как освобождает память STL (на простом примере)
какая - то функция { struct ITEM { std::wstring a; ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru