Venkata Narayana
Venkata Narayana

Reputation: 1697

Why is std::string not trivially destructible?

I'm a c++ noob and I've been reading about trivial destructibility.

From this article on trivial destructibility,

Trivially destructible types include scalar types, trivially copy constructible classes and arrays of such types.

A trivially destructible class is a class (defined with class, struct or union) that:

  • uses the implicitly defined destructor.
  • the destructor is not virtual.
  • its base class and non-static data members (if any) are themselves also trivially destructible types.

But apparently std::string is not trivially destructible. Why? Which of the above rules does std::string not satisfy?

std::cout << std::boolalpha
              << "std::string is trivially destructible? "
              << std::is_trivially_destructible<std::string>::value << '\n'

The above snippet returns the following output:

std::string is trivially destructible? false

Upvotes: 4

Views: 2298

Answers (1)

ruakh
ruakh

Reputation: 183484

A std::string typically contains a pointer to dynamically allocated character data, so it needs an explicit destructor to deallocate that memory. So, if nothing else, it must either fail this criterion:

uses the implicitly defined destructor

or have a base class that fails it, in which case it fails this criterion:

its base class and non-static data members (if any) are themselves also trivially destructible types.

Upvotes: 11

Related Questions