std::unique_ptr of base class holding reference of derived class does not show warning in gcc compiler while naked pointer shows it. Why? Unicorn Meta Zoo #1: Why another podcast? Announcing the arrival of Valued Associate #679: Cesar Manara Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!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>
Ramp colors through selected symbols in QGIS?
Why do real positive eigenvalues result in an unstable system? What about eigenvalues between 0 and 1? or 1?
How do I check if a string is entirely made of the same substring?
Are there moral objections to a life motivated purely by money? How to sway a person from this lifestyle?
Retract an already submitted recommendation letter (written for an undergrad student)
Why must Chinese maps be obfuscated?
How to have a sharp product image?
Can you stand up from being prone using Skirmisher outside of your turn?
How do I reattach a shelf to the wall when it ripped out of the wall?
How much of a wave function must reside inside event horizon for it to be consumed by the black hole?
What to do with someone that cheated their way through university and a PhD program?
Is it acceptable to use working hours to read general interest books?
Nails holding drywall
How do I deal with a coworker that keeps asking to make small superficial changes to a report, and it is seriously triggering my anxiety?
How important is it that $TERM is correct?
What was Apollo 13's "Little Jolt" after MECO?
How to keep bees out of canned beverages?
Contradiction proof for inequality of P and NP?
Complex numbers z=-3-4i polar form
Will I lose my paid in full property
What is the term for a person whose job is to place products on shelves in stores?
How can I see the price of an app I already purchased on the Google Play Store?
What does **function** actually mean in music?
What's the difference between using dependency injection with a container and using a service locator?
std::unique_ptr of base class holding reference of derived class does not show warning in gcc compiler while naked pointer shows it. Why?
Unicorn Meta Zoo #1: Why another podcast?
Announcing the arrival of Valued Associate #679: Cesar Manara
Data science time! April 2019 and salary with experience
The Ask Question Wizard is Live!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;
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
|
show 5 more comments
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
@AndriyTylychko unique_ptr exist in boost too and behavior of that and std::unique_ptr has lot of similarity. Isn't it.
– gaurav bharadwaj
7 hours ago
@ypnos do you not agree with above comment of mine?
– gaurav bharadwaj
7 hours ago
1
For the record,clangdoes complain: godbolt.org/z/qEp6Ts
– Max Langhof
6 hours ago
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
6 hours ago
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
6 hours ago
|
show 5 more comments
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
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
c++ c++14 gcc-warning
edited 7 hours ago
ypnos
37.2k1377113
37.2k1377113
asked 7 hours ago
gaurav bharadwajgaurav bharadwaj
552618
552618
@AndriyTylychko unique_ptr exist in boost too and behavior of that and std::unique_ptr has lot of similarity. Isn't it.
– gaurav bharadwaj
7 hours ago
@ypnos do you not agree with above comment of mine?
– gaurav bharadwaj
7 hours ago
1
For the record,clangdoes complain: godbolt.org/z/qEp6Ts
– Max Langhof
6 hours ago
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
6 hours ago
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
6 hours ago
|
show 5 more comments
@AndriyTylychko unique_ptr exist in boost too and behavior of that and std::unique_ptr has lot of similarity. Isn't it.
– gaurav bharadwaj
7 hours ago
@ypnos do you not agree with above comment of mine?
– gaurav bharadwaj
7 hours ago
1
For the record,clangdoes complain: godbolt.org/z/qEp6Ts
– Max Langhof
6 hours ago
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
6 hours ago
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
6 hours ago
@AndriyTylychko unique_ptr exist in boost too and behavior of that and std::unique_ptr has lot of similarity. Isn't it.
– gaurav bharadwaj
7 hours ago
@AndriyTylychko unique_ptr exist in boost too and behavior of that and std::unique_ptr has lot of similarity. Isn't it.
– gaurav bharadwaj
7 hours ago
@ypnos do you not agree with above comment of mine?
– gaurav bharadwaj
7 hours ago
@ypnos do you not agree with above comment of mine?
– gaurav bharadwaj
7 hours ago
1
1
For the record,
clang does complain: godbolt.org/z/qEp6Ts– Max Langhof
6 hours ago
For the record,
clang does complain: godbolt.org/z/qEp6Ts– Max Langhof
6 hours ago
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
6 hours ago
@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
6 hours ago
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
6 hours ago
@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
6 hours ago
|
show 5 more comments
2 Answers
2
active
oldest
votes
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.
3
That's a good find from GCC manual.
– P.W
6 hours ago
add a comment |
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.
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
3
That's a good find from GCC manual.
– P.W
6 hours ago
add a comment |
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.
3
That's a good find from GCC manual.
– P.W
6 hours ago
add a comment |
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.
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.
answered 6 hours ago
Michael KenzelMichael Kenzel
8,68811525
8,68811525
3
That's a good find from GCC manual.
– P.W
6 hours ago
add a comment |
3
That's a good find from GCC manual.
– P.W
6 hours ago
3
3
That's a good find from GCC manual.
– P.W
6 hours ago
That's a good find from GCC manual.
– P.W
6 hours ago
add a comment |
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.
add a comment |
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.
add a comment |
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.
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.
answered 6 hours ago
ArkadiyArkadiy
18.2k559103
18.2k559103
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
@AndriyTylychko unique_ptr exist in boost too and behavior of that and std::unique_ptr has lot of similarity. Isn't it.
– gaurav bharadwaj
7 hours ago
@ypnos do you not agree with above comment of mine?
– gaurav bharadwaj
7 hours ago
1
For the record,
clangdoes complain: godbolt.org/z/qEp6Ts– Max Langhof
6 hours ago
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
6 hours ago
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
6 hours ago