Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/14: Рейтинг темы: голосов - 14, средняя оценка - 4.71
3 / 3 / 0
Регистрация: 03.06.2019
Сообщений: 64

Почему данный код валидный?

02.01.2020, 22:47. Показов 3377. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Написал вот этот код на компиляторе clang новейшей версии:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
class arr{
    char* data;
    public:
    arr(char* arr){cout<<"Ctor"<<endl;}
    ~arr(){
        cout<<"Dtor"<<endl;
        delete data;
    }
};
 
int main(){
    arr A(nullptr);
    A.~arr();
}
Освобождение памяти происходит 2 раза, это говорит и вывод в консоль:
Ctor
Dtor
Dtor
[Program finished]

Но никаких ошибок. В чем дело, ребята?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.01.2020, 22:47
Ответы с готовыми решениями:

Почему работает данный код?
В разделе &quot;Комбинаторика&quot; ( https://www.cyberforum.ru/combinatorics/thread572992.html ) задали вопрос: Сколько четырехзначных чисел можно...

Как работает данный код? И почему не компилируется?
Обьясните пожалуйста как работает данный код, и скажите почему он не компилируется? И есть ли способ считать числа еще быстрее? ...

Как работает данный код и почему такой вывод?
Написал какой-то код, выводит в дебаге 5 в релизе 0 #include &lt;iostream&gt; using namespace std; void print_num(int f) { ...

27
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.01.2020, 01:52
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я уже полностью опроверг ваше "очевидно" своим контрпримером. Нет, в случае с gcc память на стеке НЕ содержит нули.
как ты объяснишь это?

https://rextester.com/WWRH29370

Добавлено через 20 секунд
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Я уже полностью опроверг ваше "очевидно" своим контрпримером. Нет, в случае с gcc память на стеке НЕ содержит нули.
как ты объяснишь это?

https://rextester.com/WWRH29370
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
03.01.2020, 02:01
Цитата Сообщение от hoggy Посмотреть сообщение
как ты объяснишь это?
Ым... Зачем "объяснять" мусор в памяти? Мне такое и в голову не может прийти.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.01.2020, 02:08
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Зачем "объяснять" мусор в памяти?
затем, что:

Цитата Сообщение от hoggy Посмотреть сообщение
в отличие от обычного мусора, в случае с gcc, нули - не случайность,
Бро.
можешь билдить/запускать 100500 раз,
и каждый раз получишь один и тот же стабильный результат.

если полазить по различным стек-оверфлоу,
можно найти ответы наподобие:

Когда процесс запрашивает память, а операционная система предоставляет процессу несколько новых страниц, kernel должен инициализировать страницы (например, с нулями), чтобы избежать отображения потенциально достоверных данных, используемых другим процессом. То же самое, когда процесс запускается и получает некоторую память, например, сегмент стека.
как насчет твоего объяснения?

а то может ты думаешь, что эти нули - чистая случайность?
типа... совершенно случайно во всех 100500 запусках выпали нули.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
03.01.2020, 02:08
Цитата Сообщение от IGPIGP Посмотреть сообщение
Однако если выделить память по указателю а в деструкторе затребовать его освобождения то вызвать деструктор дважды подряд не получится. Может есть операционки которым это всё равно, но я не встречал.
Написал высокопарную чушь. На ночь глядя.
MinGW генерит код который работает:
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
25
26
27
28
#include <iostream>
using namespace std;
 
class arr{
    public:
    int data, *pdata;
 
    arr(int data_=1):data(data_)
        {
            pdata = new int[data];
            cout<<"Ctor\n"<<endl;
        }
    ~arr()  {
                if(data){
                        --data;
                        cout<<"dtor "<<data<<'\n';
                        delete []pdata;
                        this->~arr();
                }
            }
};
 
int main()
{
arr A(1000);
A.~arr();
return 0;
}
??
Студия валится при первом же перезапуске в рекурсии. Это то к чему я привык. Но не ожидал от GNU для Винды такого.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
03.01.2020, 02:32
Цитата Сообщение от hoggy Посмотреть сообщение
можешь билдить/запускать 100500 раз,
и каждый раз получишь один и тот же стабильный результат.
Да, да, дад...

Смотрим сюда
http://coliru.stacked-crooked.... eec82870d0

а потом сюда
http://coliru.stacked-crooked.... 8f891cc69a

и перестаем нести чушь.

Цитата Сообщение от hoggy Посмотреть сообщение
если полазить по различным стек-оверфлоу,
можно найти ответы наподобие:
Когда процесс запрашивает память, а операционная система предоставляет процессу несколько новых страниц, kernel должен инициализировать страницы (например, с нулями), чтобы избежать отображения потенциально достоверных данных, используемых другим процессом. То же самое, когда процесс запускается и получает некоторую память, например, сегмент стека.
как насчет твоего объяснения?
О, это очень просто! Если вам привиделось, что что-то написанное на "стековерфлоу" не совпадает с тем, что говорю я, то либо 1) на "стековерфлоу" написан потешный глупый бред, либо 2) на "стековерфлоу" написано все правильно, но вы сами просто не в состоянии понять, о чем там идет речь, т.е. имеет место классический эффект "смотрит в книгу, а видит фигу".

Конечно же, в данном случае можно с высокой степенью уверенности сказать, что имеет место именно вторая ситуация ))

Цитата Сообщение от hoggy Посмотреть сообщение
а то может ты думаешь, что эти нули - чистая случайность?
типа... совершенно случайно во всех 100500 запусках выпали нули.
Именно так. Если я сказал "случайно", значит случайно. Если завтра я скажу "виноваты зеленые человечки", то будут виноваты зеленые человечки. До тех пор, пока я не скажу что-то еще. Для вас пока - только так, без вариантов.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.01.2020, 04:09
вот это уже больше похоже на правду:
Не могу заставить g++ не инициализировать локальную переменную нулем
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13212 / 6845 / 1825
Регистрация: 18.10.2014
Сообщений: 17,325
03.01.2020, 04:22
Цитата Сообщение от hoggy Посмотреть сообщение
вот это уже больше похоже на правду:
Не могу заставить g++ не инициализировать локальную переменную нулем
А может надо учится самому смотреть на код, сгенерированный компилятором, вместо того, нести чушь, а потом пытаться выбираться из позорной ситуации путем выискивания всяких "кулстори" из интернета? Даже в GCC 4.8.1: https://godbolt.org/z/CnK58Z

Кстати, особенно удивительно это читать, если учесть, что почти все там написанное соответствует вашим утверждениям "с точностью до наоборот":

1. Об обнулении локальных переменных речь идет именно для MSVС на Windows (хоть это и не правда).
2. Ясно сказано: "Про инициализацию стека - полная бредятина, пример из поста #11 налгядно это демонстрирует" (sic)

)))
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
03.01.2020, 05:40
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А может надо учится самому смотреть на код, сгенерированный компилятором, вместо того, нести чушь, а потом пытаться выбираться из позорной ситуации путем выискивания всяких
так иди и учись.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.01.2020, 05:40

Почему данный код игнорирует 1-ый символ и приходится первую букву дублировать?
Здравствуйте, подскажите пожалуйста почему данный код игнорирует 1-ый символ и приходится первую букву дублировать ? #include...

Что делает данный код?
#include &lt;iostream&gt; #include &lt;queue&gt; using namespace std; int main() { queue &lt;int&gt; x1; queue &lt;int&gt; x2; queue &lt;int&gt;...

Помогите упростить данный код
Не знаю как упростить((( #include &lt;iostream.h&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; main() {

Что означает данный код?
Здравствуйте, что делает/означает данная строка кода? В гугле не мог найти, так как не знаю название данной фишки. float4 main( float3...

Объясните, пожалуйста, данный код
Здравствуйте, объясните пожалуйста построчно данный код. Задача: В одномерном массиве исключить все вхождения заданного числа. Массив...


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

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru