Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

03.03.2014, 21:32. Просмотров 325. Ответов 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 байт, на которые указывает указатель, а затем освобождает память (C++):

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

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

Из массива JJ(100) в массив NN(100) перенести числа (элементы массива) сначала нечетные, а затем четные. - C++
Из массива JJ(100) в массив NN(100) перенести числа (элементы массива) сначала нечетные, а затем четные. Вывести массив NN на печать по 10...

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

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

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

8
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
03.03.2014, 21:42 #2
Я вижу всего одну пользу.
static для функции позволяет объявить функцию,
локализованную в том файле, где она объявлена.
В другой файл ее не получить.
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
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 / 0
Регистрация: 28.08.2013
Сообщений: 409
03.03.2014, 21:57  [ТС] #4
void* pointer это как понимать?
0
zss
Модератор
Эксперт С++
6928 / 6490 / 2182
Регистрация: 18.12.2011
Сообщений: 17,105
Завершенные тесты: 1
03.03.2014, 22:05 #5
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
void* pointer
Означает, что указатель не имеет типа.
Поэтому в качестве параметра можно передавать любой указатель.
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
03.03.2014, 22:05 #6
Цитата Сообщение от Zla9_Kolu4ka Посмотреть сообщение
void* pointer это как понимать?
Это указатель на неопределенный тип.
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
03.03.2014, 22:09 #7
Какие типы можно ему присваивать определяют правило автоматического преобразования указателей С++.
Это могут быть указатели на объекты, либо указатели на начало последовательности объектов или же nullptr.
Указатели на функции, методы, члены класса в этот список не входят.
0
castaway
Эксперт С++
4926 / 3033 / 372
Регистрация: 10.11.2010
Сообщений: 11,084
Записей в блоге: 10
Завершенные тесты: 1
03.03.2014, 22:21 #8
Функция main должна возвращать значение типа int. Это первая ошибка.
Перегруженный оператор delete нельзя объявить со спецификатором static. Это вторая.
А вообще, static для функций означает внутреннее связывание, т.е. её (функцию/оператор) нельзя увидеть извне.
Там, откуда вы взяли этот код, скорее всего об этом упомянается..
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
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? - C++
Если моя программа допускает кучу memory leaks - ов, то после закрытия процесса программы утерянная (утёкшая) память будет так же...

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

Получить новый массив, в котором сначала идут положительные числа, затем нулевые, затем отрицательные исходного - C++
дан массив X(N). получить новый массив Y(N), такой, что в нем сначала идут положительные числа, затем нулевые, и затем отрицательные из Х....

Сформировать из значений массива другой массив, расположив в нем сначала цифры, затем – буквы, затем - символы, не являющихся ни буквами, ни цифрами - C++
Создать массив из 20 символьных значений. Сформировать из его значений другой массив, расположив в нем сначала цифры, затем – буквы, затем...


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

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

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