Здравствуйте, rg45, Вы писали:
R>Вот именно, использование new там было вообще не в тему — даже в контесте его вопроса. Это лишь линший раз демонстрирует в какую кучу свалены мухи и котлеты в его голове. И сам он эту кучу разгребать не хочет, а тащит ее нам, чтоб мы разбирались в лабиринтах его сложного Квалиа.
У меня как раз вопрос присваивания стековой памяти, которая освобождается при выходе из функции.
R>Полностью согласен. Я и сам проходил по маршруту C++ -> C#. И знаю многих людей, которые преодолели этот путь без особого труда и в кратчайшие сроки. А вот в обратную сторону... что-то ни одного не припоминаю. Сплошные стоны и сопли.
Я, дело в том что, вынужден "марать руки" в С++ — никуда от этого не деться. Хотя проект то не на С++ у нас. Просто внешние библиотеки нужно чуток править.
И понял что это все-равно кому-то нужно будет делать и никто не хочет — все боятся. И чем дальше — тем все меньше в живых и при памяти остается людей, кто может это делать.
S>Нужно было уточнить как раз — меня больше интересовал вопрос присваивания стековой памяти, которая освобождается при выходе из фукнции, переменной которая в куче.
S>Вы хотите сказать в этом программа корректна? Она же мусор выводит на экран при сборке в VS, к примеру.
Я уже запутался. Ты смешал в кучу два или три разных топика. Изначально речь шла про ворсинки статического анализа. Я показал, какой ворнинг выдает clang-analyzer.
Далее твой вопрос про освобождение стековой памяти. На что я посоветовал почитать про стыковую память и память в куче, потому что налицо пробел в понимании работы памяти в плюсах.
Выше есть мои коменты в коде. Там вроде все понятно.
Здравствуйте, DiPaolo, Вы писали:
DP>Я уже запутался. Ты смешал в кучу два или три разных топика. Изначально речь шла про ворсинки статического анализа. Я показал, какой ворнинг выдает clang-analyzer.
Больше интересовал вопрос варнинга именно при присвоении стековой памяти.
DP>Далее твой вопрос про освобождение стековой памяти. На что я посоветовал почитать про стыковую память и память в куче, потому что налицо пробел в понимании работы памяти в плюсах.
Нет, именно в этом изначальный вопрос был — почему не выдается варнинг при присвоении стековой памяти переменной, которая явно выносит ее за пределы доступности.
DP>Выше есть мои коменты в коде. Там вроде все понятно.
Вы, похоже, тоже не заметили этой проблемы — увидели только что память не освобождена — а проблему присвоения стековой памяти — не заметили?
S>Вы, похоже, тоже не заметили этой проблемы — увидели только что память не освобождена — а проблему присвоения стековой памяти — не заметили?
Не заметил. Я просто скопипастил то, что выдал статик аналайзер, о чем и был изначальный вопрос. Почему статический анализатор в моем случае не показывает ворнинг там — хз.
Здравствуйте, Shmj, Вы писали:
R>>Вот именно, использование new там было вообще не в тему — даже в контесте его вопроса. Это лишь линший раз демонстрирует в какую кучу свалены мухи и котлеты в его голове. И сам он эту кучу разгребать не хочет, а тащит ее нам, чтоб мы разбирались в лабиринтах его сложного Квалиа.
S>У меня как раз вопрос присваивания стековой памяти, которая освобождается при выходе из функции.
Усыпить, чтоб не мучился
Ты правда ни хера не понял в моих словах? Скажи, что ты просто прикидываешься, ну пожалуйста!
Здравствуйте, T4r4sB, Вы писали:
TB>Ну перепишешь ты этот код на std::array и ссылки. Лучше станет? Нет
Станет лучше или нет — это смотря кому, но по крайней мере будет работать:
#include <array>
#include <iostream>
#include <memory>
#include <string>
class C1
{
public:
std::shared_ptr<const std::array<char, 2>> V1;
};
std::shared_ptr<C1> fun2()
{
std::shared_ptr<std::array<char, 2>> t = std::make_shared<std::array<char, 2>>();
std::array<char, 2>& ref = *t;
ref[0] = 't';
ref[1] = '\0';
std::shared_ptr<C1> c = std::make_shared<C1>();
c->V1 = t;
return c;
}
int main()
{
auto t = fun2();
std::cout << t->V1->data() << "\n";
}
#include <iostream>
#include <memory>
#include <string>
struct C1
{
C1(const std::string& str) : V1{str}{}
const std::string V1;
};
std::shared_ptr<C1> fun2()
{
std::string t = "t\0";
std::shared_ptr<C1> c = std::make_shared<C1>(t);
return c;
}
int main()
{
auto t = fun2();
std::cout << t->V1 << "\n";
}
Здравствуйте, pilgrim_, Вы писали:
_>PVS, более человеческое предупреждение _><source>:16:1: warning: V507 Pointer to local array 't' is stored outside the scope of this array. Such a pointer will become invalid.
Прикольно, если переписать исходный пример нормально, с unique_ptr, PVS не выдает предупреждение. А вот GCC 13 -- выдает https://gcc.godbolt.org/z/d87ohc4dE
Здравствуйте, so5team, Вы писали:
S>Прикольно, если переписать исходный пример нормально, с unique_ptr, PVS не выдает предупреждение. А вот GCC 13 -- выдает S>https://gcc.godbolt.org/z/d87ohc4dE
Нет в мире совершенства , да и GCC почему-то только с оптимизацией выдаёт предупреждение.
Здравствуйте, rg45, Вы писали:
R>>>Вот именно, использование new там было вообще не в тему — даже в контесте его вопроса. Это лишь линший раз демонстрирует в какую кучу свалены мухи и котлеты в его голове. И сам он эту кучу разгребать не хочет, а тащит ее нам, чтоб мы разбирались в лабиринтах его сложного Квалиа.
R>Ты правда ни хера не понял в моих словах? Скажи, что ты просто прикидываешься, ну пожалуйста!
Я не призываю так писать — мой вопрос лишь в статистическом анализаторе, который такие вещи сможет обнаружить.
Здравствуйте, Shmj, Вы писали:
S>Я не призываю так писать — мой вопрос лишь в статистическом анализаторе, который такие вещи сможет обнаружить.
Какие "такие"? Ты нахера утечку памяти туда воткнул, когда твой вопрос касался указателей и ссылок на локальные переменные, чье время жизни меньше времени жизни ссылок и указателей? А я скажу нахера — просто в голове у тебя полная каша. И вместо того, чтоб что-то читать и разбираться, ты тащишь всех своих тараканов сюда.
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, rg45, Вы писали:
R>>Вот именно, использование new там было вообще не в тему — даже в контесте его вопроса. Это лишь линший раз демонстрирует в какую кучу свалены мухи и котлеты в его голове. И сам он эту кучу разгребать не хочет, а тащит ее нам, чтоб мы разбирались в лабиринтах его сложного Квалиа.
S>У меня как раз вопрос присваивания стековой памяти, которая освобождается при выходе из функции.
Одно из необходимых умений программиста — это способность составлять МИНИМАЛЬНЫЙ пример, иллюстрирующий проблему.
У тебя же в коде ещё и всякий мусор типа оператора new, кстати нахрена он нужен после 11 года?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, rg45, Вы писали:
S>>Я не призываю так писать — мой вопрос лишь в статистическом анализаторе, который такие вещи сможет обнаружить.
R>Какие "такие"? Ты нахера утечку памяти туда воткнул, когда твой вопрос касался указателей и ссылок на локальные переменные, чье время жизни меньше времени жизни ссылок и указателей?
Утечку памяти воткнул случайно, т.к. еще не отработал привычку очистки. Потом увидел но решил не исправлять — т.к. хороший анализатор должен и это увидеть.
Здравствуйте, Shmj, Вы писали:
S>Утечку памяти воткнул случайно, т.к. еще не отработал привычку очистки. Потом увидел но решил не исправлять — т.к. хороший анализатор должен и это увидеть.
Так вот знай, за "привычку очистки" в приличных конторах бьют линейкой по рукам так же точно, как и за утечку, которую ты "воткнул случайно". А могут и прощальный подсрачник выписать. Я тебе в третий раз даю эту ссылку: RAII. Почитай, это найважнейший принцип, без которого не пишется ни одна современная программа на С++.