No, not correct. b is of type char * and you assign to it a shared_ptr<char>. You should get a compilation error.
Furthermore, the constructor is private, another compilation error.
And how do you access b in func()? It is private in A.
Obviously your exercise is incomplete... so I just go from what you provided.
Also I suggest to use unique_ptr in case you can say it is a unique ownership (which it appears to be in my opinion).
This compiles:
#include <memory> #include <iostream> class A { public: A() { std::cout << "A created with unique pointer" << std::endl; b = std::unique_ptr<char>(new char[100] { 0 }); } ~A() { std::cout << "A destroyed" << std::endl; } private: std::unique_ptr<char> b; }; void func() { A a; } int main() { std::cout << "Call func()" << std::endl; func(); std::cout << "func() called" << std::endl; return 0; }
And at the end of func() A is destroyed and with it the unique_ptr.
However, ask yourself if you really need to use pointer? In your case an automatic variable should be just fine; it does the same (i.e. being destroyed when func() exits.
shared_ptrwith an array in that fashion is correct. Maybe it is, I'm not sure.shared_ptr<T[]>has been proposed for C++17. I thought I saw somewhere that it was accepted, but I could be wrong.