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

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

02.01.2020, 22:47. Показов 3324. Ответов 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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
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
Ответ Создать тему
Новые блоги и статьи
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
сукцессия 9. Математика подлости: как растения предали грибных друзей
anaschu 27.06.2026
Статья 2. Глобальная фосфорная война: эволюционно-экономические механизмы распределения биомов Земли Введение: Экологический рынок как игра с нулевой суммой Традиционная экология долгое время. . .
сукцессия 8. Как я спорил с ИИ, которые - агенты растений и ненавистники грибов!
anaschu 27.06.2026
Статья 1. Хроники грибного восстания: как Сократов диалог разрушил академические догмы ИИ Введение: Синдром «цифрового учебника» Современные большие языковые модели (LLM) обладают колоссальным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru