std::unique_ptr of base class holding reference of derived class does not show warning in gcc compiler while naked pointer shows it. Why?Why unique-ptr doesn't check base class to virtual destructible?Does delete work with pointers to base class?Why does an overridden function in the derived class hide other overloads of the base class?Why simple destructor does not delete the derived object if declared using base pointerCalling a Derived Class method from a Void Pointer cast to a Base Objectclang & gcc don't warn about non-virtual base destructors for polymorphism when using smart pointers?Why is initialization of derived class through a base class pointer different from that through a derived class pointer?Destructor when derived class contains a pointer to base class objectUsing base class rather than base pointer to work on derived classHow to prevent a derived class object under base class pointer calling a public nonvirtual function defined in base class but overridden in derived?How can I convert std::make_unique<derived>() to std::unique_ptr<base>

Does the EU Common Fisheries Policy cover British Overseas Territories?

How to replace the "space symbol" (squat-u) in listings?

How to set the font color of quantity objects (Version 11.3 vs version 12)?

How can I get precisely a certain cubic cm by changing the following factors?

TikZ how to make supply and demand arrows for nodes?

Minimum value of 4 digit number divided by sum of its digits

Lock in SQL Server and Oracle

Historically, were women trained for obligatory wars? Or did they serve some other military function?

Examples of non trivial equivalence relations , I mean equivalence relations without the expression " same ... as" in their definition?

When did stoichiometry begin to be taught in U.S. high schools?

Why do Ichisongas hate elephants and hippos?

How does a Swashbuckler rogue "fight with two weapons while safely darting away"?

Need help understanding harmonic series and intervals

What does YCWCYODFTRFDTY mean?

How to determine the actual or "true" resolution of a digital photograph?

Does a creature that is immune to a condition still make a saving throw?

Is it possible to measure lightning discharges as Nikola Tesla?

When to run a blank using ICP-MS

How can Republicans who favour free markets, consistently express anger when they don't like the outcome of that choice?

What's the metal clinking sound at the end of credits in Avengers: Endgame?

Subtleties of choosing the sequence of tenses in Russian

Why was Germany not as successful as other Europeans in establishing overseas colonies?

Possible to set `foldexpr` using a function reference?

What are the spoon bit of a spoon and fork bit of a fork called?



std::unique_ptr of base class holding reference of derived class does not show warning in gcc compiler while naked pointer shows it. Why?


Why unique-ptr doesn't check base class to virtual destructible?Does delete work with pointers to base class?Why does an overridden function in the derived class hide other overloads of the base class?Why simple destructor does not delete the derived object if declared using base pointerCalling a Derived Class method from a Void Pointer cast to a Base Objectclang & gcc don't warn about non-virtual base destructors for polymorphism when using smart pointers?Why is initialization of derived class through a base class pointer different from that through a derived class pointer?Destructor when derived class contains a pointer to base class objectUsing base class rather than base pointer to work on derived classHow to prevent a derived class object under base class pointer calling a public nonvirtual function defined in base class but overridden in derived?How can I convert std::make_unique<derived>() to std::unique_ptr<base>






.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;








26















I have a hierarchy of base class and derived class. Base class has one virtual function which is overridden by derived class.



class Base

public:
~Base();
virtual void other_functionality() = 0;
;

class Derived : public Base

public:
~Derived ();
void other_functionality() //some code;
;


Now if i do like this:



int main()

Base * P = new Derived ();
delete p;
return 0;



It gives error:
deleting object of polymorphic class type which has non-virtual destructor.



But with unique_ptr it passes without warning.



int main()

std::unique_ptr<Base> p;
p.reset(new Derived ());

return 0;



I know if I use virtual destructor. Warning with naked pointer will be solved. But question remains - why absence of virtual destructor shows problem with naked pointer and not with unique_ptr.










share|improve this question



















  • 2





    For the record, clang does complain: godbolt.org/z/qEp6Ts

    – Max Langhof
    Apr 25 at 12:24






  • 1





    @P.W I don't think this is a duplicate. At least, answers to both questions are different. (Answer to the original question is "because the Stadnard does not require such a check". Answer to this question is "because gcc supresses warnings for system headers".)

    – Daniel Langr
    Apr 25 at 12:35







  • 1





    @DanielLangr: The question seemed the same in essence. But the answers do not directly address why the compiler does not issue a diagnostic. So I will reopen.

    – P.W
    Apr 25 at 12:38






  • 1





    @gauravbharadwaj it's also in C++17 and pretty much guaranteed to be in C++20. I don't think this question is really specific to any particular version of the language at this point…

    – Michael Kenzel
    Apr 25 at 13:14







  • 1





    @gauravbharadwaj I think it is fair that you tagged boost, and that other guy's comment was ridiculously worded. However I also believe the tag is wrong, this is a pure standard C++ matter and you do not even know about the existence of boost to answer this question.

    – ypnos
    2 days ago

















26















I have a hierarchy of base class and derived class. Base class has one virtual function which is overridden by derived class.



class Base

public:
~Base();
virtual void other_functionality() = 0;
;

class Derived : public Base

public:
~Derived ();
void other_functionality() //some code;
;


Now if i do like this:



int main()

Base * P = new Derived ();
delete p;
return 0;



It gives error:
deleting object of polymorphic class type which has non-virtual destructor.



But with unique_ptr it passes without warning.



int main()

std::unique_ptr<Base> p;
p.reset(new Derived ());

return 0;



I know if I use virtual destructor. Warning with naked pointer will be solved. But question remains - why absence of virtual destructor shows problem with naked pointer and not with unique_ptr.










share|improve this question



















  • 2





    For the record, clang does complain: godbolt.org/z/qEp6Ts

    – Max Langhof
    Apr 25 at 12:24






  • 1





    @P.W I don't think this is a duplicate. At least, answers to both questions are different. (Answer to the original question is "because the Stadnard does not require such a check". Answer to this question is "because gcc supresses warnings for system headers".)

    – Daniel Langr
    Apr 25 at 12:35







  • 1





    @DanielLangr: The question seemed the same in essence. But the answers do not directly address why the compiler does not issue a diagnostic. So I will reopen.

    – P.W
    Apr 25 at 12:38






  • 1





    @gauravbharadwaj it's also in C++17 and pretty much guaranteed to be in C++20. I don't think this question is really specific to any particular version of the language at this point…

    – Michael Kenzel
    Apr 25 at 13:14







  • 1





    @gauravbharadwaj I think it is fair that you tagged boost, and that other guy's comment was ridiculously worded. However I also believe the tag is wrong, this is a pure standard C++ matter and you do not even know about the existence of boost to answer this question.

    – ypnos
    2 days ago













26












26








26








I have a hierarchy of base class and derived class. Base class has one virtual function which is overridden by derived class.



class Base

public:
~Base();
virtual void other_functionality() = 0;
;

class Derived : public Base

public:
~Derived ();
void other_functionality() //some code;
;


Now if i do like this:



int main()

Base * P = new Derived ();
delete p;
return 0;



It gives error:
deleting object of polymorphic class type which has non-virtual destructor.



But with unique_ptr it passes without warning.



int main()

std::unique_ptr<Base> p;
p.reset(new Derived ());

return 0;



I know if I use virtual destructor. Warning with naked pointer will be solved. But question remains - why absence of virtual destructor shows problem with naked pointer and not with unique_ptr.










share|improve this question
















I have a hierarchy of base class and derived class. Base class has one virtual function which is overridden by derived class.



class Base

public:
~Base();
virtual void other_functionality() = 0;
;

class Derived : public Base

public:
~Derived ();
void other_functionality() //some code;
;


Now if i do like this:



int main()

Base * P = new Derived ();
delete p;
return 0;



It gives error:
deleting object of polymorphic class type which has non-virtual destructor.



But with unique_ptr it passes without warning.



int main()

std::unique_ptr<Base> p;
p.reset(new Derived ());

return 0;



I know if I use virtual destructor. Warning with naked pointer will be solved. But question remains - why absence of virtual destructor shows problem with naked pointer and not with unique_ptr.







c++ c++14 gcc-warning






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Apr 25 at 12:09









ypnos

37.2k1377113




37.2k1377113










asked Apr 25 at 12:01









gaurav bharadwajgaurav bharadwaj

602719




602719







  • 2





    For the record, clang does complain: godbolt.org/z/qEp6Ts

    – Max Langhof
    Apr 25 at 12:24






  • 1





    @P.W I don't think this is a duplicate. At least, answers to both questions are different. (Answer to the original question is "because the Stadnard does not require such a check". Answer to this question is "because gcc supresses warnings for system headers".)

    – Daniel Langr
    Apr 25 at 12:35







  • 1





    @DanielLangr: The question seemed the same in essence. But the answers do not directly address why the compiler does not issue a diagnostic. So I will reopen.

    – P.W
    Apr 25 at 12:38






  • 1





    @gauravbharadwaj it's also in C++17 and pretty much guaranteed to be in C++20. I don't think this question is really specific to any particular version of the language at this point…

    – Michael Kenzel
    Apr 25 at 13:14







  • 1





    @gauravbharadwaj I think it is fair that you tagged boost, and that other guy's comment was ridiculously worded. However I also believe the tag is wrong, this is a pure standard C++ matter and you do not even know about the existence of boost to answer this question.

    – ypnos
    2 days ago












  • 2





    For the record, clang does complain: godbolt.org/z/qEp6Ts

    – Max Langhof
    Apr 25 at 12:24






  • 1





    @P.W I don't think this is a duplicate. At least, answers to both questions are different. (Answer to the original question is "because the Stadnard does not require such a check". Answer to this question is "because gcc supresses warnings for system headers".)

    – Daniel Langr
    Apr 25 at 12:35







  • 1





    @DanielLangr: The question seemed the same in essence. But the answers do not directly address why the compiler does not issue a diagnostic. So I will reopen.

    – P.W
    Apr 25 at 12:38






  • 1





    @gauravbharadwaj it's also in C++17 and pretty much guaranteed to be in C++20. I don't think this question is really specific to any particular version of the language at this point…

    – Michael Kenzel
    Apr 25 at 13:14







  • 1





    @gauravbharadwaj I think it is fair that you tagged boost, and that other guy's comment was ridiculously worded. However I also believe the tag is wrong, this is a pure standard C++ matter and you do not even know about the existence of boost to answer this question.

    – ypnos
    2 days ago







2




2





For the record, clang does complain: godbolt.org/z/qEp6Ts

– Max Langhof
Apr 25 at 12:24





For the record, clang does complain: godbolt.org/z/qEp6Ts

– Max Langhof
Apr 25 at 12:24




1




1





@P.W I don't think this is a duplicate. At least, answers to both questions are different. (Answer to the original question is "because the Stadnard does not require such a check". Answer to this question is "because gcc supresses warnings for system headers".)

– Daniel Langr
Apr 25 at 12:35






@P.W I don't think this is a duplicate. At least, answers to both questions are different. (Answer to the original question is "because the Stadnard does not require such a check". Answer to this question is "because gcc supresses warnings for system headers".)

– Daniel Langr
Apr 25 at 12:35





1




1





@DanielLangr: The question seemed the same in essence. But the answers do not directly address why the compiler does not issue a diagnostic. So I will reopen.

– P.W
Apr 25 at 12:38





@DanielLangr: The question seemed the same in essence. But the answers do not directly address why the compiler does not issue a diagnostic. So I will reopen.

– P.W
Apr 25 at 12:38




1




1





@gauravbharadwaj it's also in C++17 and pretty much guaranteed to be in C++20. I don't think this question is really specific to any particular version of the language at this point…

– Michael Kenzel
Apr 25 at 13:14






@gauravbharadwaj it's also in C++17 and pretty much guaranteed to be in C++20. I don't think this question is really specific to any particular version of the language at this point…

– Michael Kenzel
Apr 25 at 13:14





1




1





@gauravbharadwaj I think it is fair that you tagged boost, and that other guy's comment was ridiculously worded. However I also believe the tag is wrong, this is a pure standard C++ matter and you do not even know about the existence of boost to answer this question.

– ypnos
2 days ago





@gauravbharadwaj I think it is fair that you tagged boost, and that other guy's comment was ridiculously worded. However I also believe the tag is wrong, this is a pure standard C++ matter and you do not even know about the existence of boost to answer this question.

– ypnos
2 days ago












2 Answers
2






active

oldest

votes


















31














Well, first of all, deleting a derived object through a base pointer when the base class does not have a virtual destructor is undefined behavior. Compilers are not required to diagnose undefined behavior…



That being said, the reason why this warning does not appear when using std::unique_ptr is most likely due to the fact that GCC does not report warnings that would appear in system headers.






share|improve this answer


















  • 5





    That's a good find from GCC manual.

    – P.W
    Apr 25 at 12:48


















18














I cannot find a link, but I did see a discussion of this online, in GCC bug database.



The warning is issued on the actual delete expression. In the case of unique_ptr, the delete is called inside a system header file.



According to the discussion in that bug report, implementing C++ system libraries requires all sorts of compromises that result in various warnings. Therefore, the warnings are restricted inside system headers. That is the reason you won't see the warning you expect.



Update: and here it is, straight from the horse's mouth:



https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html




The header files declaring interfaces to the operating system and runtime libraries often cannot be written in strictly conforming C. Therefore, GCC gives code found in system headers special treatment. All warnings, other than those generated by ‘#warning’ (see Diagnostics), are suppressed while GCC is processing a system header.







share|improve this answer























    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55848866%2fstdunique-ptr-of-base-class-holding-reference-of-derived-class-does-not-show-w%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    31














    Well, first of all, deleting a derived object through a base pointer when the base class does not have a virtual destructor is undefined behavior. Compilers are not required to diagnose undefined behavior…



    That being said, the reason why this warning does not appear when using std::unique_ptr is most likely due to the fact that GCC does not report warnings that would appear in system headers.






    share|improve this answer


















    • 5





      That's a good find from GCC manual.

      – P.W
      Apr 25 at 12:48















    31














    Well, first of all, deleting a derived object through a base pointer when the base class does not have a virtual destructor is undefined behavior. Compilers are not required to diagnose undefined behavior…



    That being said, the reason why this warning does not appear when using std::unique_ptr is most likely due to the fact that GCC does not report warnings that would appear in system headers.






    share|improve this answer


















    • 5





      That's a good find from GCC manual.

      – P.W
      Apr 25 at 12:48













    31












    31








    31







    Well, first of all, deleting a derived object through a base pointer when the base class does not have a virtual destructor is undefined behavior. Compilers are not required to diagnose undefined behavior…



    That being said, the reason why this warning does not appear when using std::unique_ptr is most likely due to the fact that GCC does not report warnings that would appear in system headers.






    share|improve this answer













    Well, first of all, deleting a derived object through a base pointer when the base class does not have a virtual destructor is undefined behavior. Compilers are not required to diagnose undefined behavior…



    That being said, the reason why this warning does not appear when using std::unique_ptr is most likely due to the fact that GCC does not report warnings that would appear in system headers.







    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Apr 25 at 12:24









    Michael KenzelMichael Kenzel

    8,91311625




    8,91311625







    • 5





      That's a good find from GCC manual.

      – P.W
      Apr 25 at 12:48












    • 5





      That's a good find from GCC manual.

      – P.W
      Apr 25 at 12:48







    5




    5





    That's a good find from GCC manual.

    – P.W
    Apr 25 at 12:48





    That's a good find from GCC manual.

    – P.W
    Apr 25 at 12:48













    18














    I cannot find a link, but I did see a discussion of this online, in GCC bug database.



    The warning is issued on the actual delete expression. In the case of unique_ptr, the delete is called inside a system header file.



    According to the discussion in that bug report, implementing C++ system libraries requires all sorts of compromises that result in various warnings. Therefore, the warnings are restricted inside system headers. That is the reason you won't see the warning you expect.



    Update: and here it is, straight from the horse's mouth:



    https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html




    The header files declaring interfaces to the operating system and runtime libraries often cannot be written in strictly conforming C. Therefore, GCC gives code found in system headers special treatment. All warnings, other than those generated by ‘#warning’ (see Diagnostics), are suppressed while GCC is processing a system header.







    share|improve this answer



























      18














      I cannot find a link, but I did see a discussion of this online, in GCC bug database.



      The warning is issued on the actual delete expression. In the case of unique_ptr, the delete is called inside a system header file.



      According to the discussion in that bug report, implementing C++ system libraries requires all sorts of compromises that result in various warnings. Therefore, the warnings are restricted inside system headers. That is the reason you won't see the warning you expect.



      Update: and here it is, straight from the horse's mouth:



      https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html




      The header files declaring interfaces to the operating system and runtime libraries often cannot be written in strictly conforming C. Therefore, GCC gives code found in system headers special treatment. All warnings, other than those generated by ‘#warning’ (see Diagnostics), are suppressed while GCC is processing a system header.







      share|improve this answer

























        18












        18








        18







        I cannot find a link, but I did see a discussion of this online, in GCC bug database.



        The warning is issued on the actual delete expression. In the case of unique_ptr, the delete is called inside a system header file.



        According to the discussion in that bug report, implementing C++ system libraries requires all sorts of compromises that result in various warnings. Therefore, the warnings are restricted inside system headers. That is the reason you won't see the warning you expect.



        Update: and here it is, straight from the horse's mouth:



        https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html




        The header files declaring interfaces to the operating system and runtime libraries often cannot be written in strictly conforming C. Therefore, GCC gives code found in system headers special treatment. All warnings, other than those generated by ‘#warning’ (see Diagnostics), are suppressed while GCC is processing a system header.







        share|improve this answer













        I cannot find a link, but I did see a discussion of this online, in GCC bug database.



        The warning is issued on the actual delete expression. In the case of unique_ptr, the delete is called inside a system header file.



        According to the discussion in that bug report, implementing C++ system libraries requires all sorts of compromises that result in various warnings. Therefore, the warnings are restricted inside system headers. That is the reason you won't see the warning you expect.



        Update: and here it is, straight from the horse's mouth:



        https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html




        The header files declaring interfaces to the operating system and runtime libraries often cannot be written in strictly conforming C. Therefore, GCC gives code found in system headers special treatment. All warnings, other than those generated by ‘#warning’ (see Diagnostics), are suppressed while GCC is processing a system header.








        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Apr 25 at 12:28









        ArkadiyArkadiy

        18.3k559103




        18.3k559103



























            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55848866%2fstdunique-ptr-of-base-class-holding-reference-of-derived-class-does-not-show-w%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Category:9 (number) SubcategoriesMedia in category "9 (number)"Navigation menuUpload mediaGND ID: 4485639-8Library of Congress authority ID: sh85091979ReasonatorScholiaStatistics

            Circuit construction for execution of conditional statements using least significant bitHow are two different registers being used as “control”?How exactly is the stated composite state of the two registers being produced using the $R_zz$ controlled rotations?Efficiently performing controlled rotations in HHLWould this quantum algorithm implementation work?How to prepare a superposed states of odd integers from $1$ to $sqrtN$?Why is this implementation of the order finding algorithm not working?Circuit construction for Hamiltonian simulationHow can I invert the least significant bit of a certain term of a superposed state?Implementing an oracleImplementing a controlled sum operation

            Magento 2 “No Payment Methods” in Admin New OrderHow to integrate Paypal Express Checkout with the Magento APIMagento 1.5 - Sales > Order > edit order and shipping methods disappearAuto Invoice Check/Money Order Payment methodAdd more simple payment methods?Shipping methods not showingWhat should I do to change payment methods if changing the configuration has no effects?1.9 - No Payment Methods showing upMy Payment Methods not Showing for downloadable/virtual product when checkout?Magento2 API to access internal payment methodHow to call an existing payment methods in the registration form?