Move Semantics in C++

Поділитися
Вставка
  • Опубліковано 7 чер 2024
  • The first 1000 people who click the link in the description will get 2 free months of Skillshare Premium: skl.sh/thechernoproject8
    Patreon ► / thecherno
    Instagram ► / thecherno
    Twitter ► / thecherno
    Discord ► thecherno.com/discord
    Series Playlist ► thecherno.com/cpp
    This video is sponsored by Skillshare.

КОМЕНТАРІ • 444

  • @TheCherno
    @TheCherno  4 роки тому +231

    Hope you all enjoyed the video! This is just the beginning of the Move Semantics Saga™, still to come is std::move, the move assignment operator, and more! Thanks for watching! ❤️
    P.S. RELAX GUYS THE PS5 PART 2 VIDEO IS COMING TOMORROW

    • @nothingtosee226
      @nothingtosee226 4 роки тому

      Do you have your own personal library of functions, classes, namespaces, etc? My professor told me that it's important for programmers to have their own tools which make their own methods easier.

    • @AtlasPrimeV
      @AtlasPrimeV 4 роки тому

      ok

    • @platinoob__2495
      @platinoob__2495 4 роки тому +1

      Excuse me, I know this is out of the point, but, do you know a way to turn off auto save in Visual Studio Community 2019?

    • @pratikpatil1383
      @pratikpatil1383 4 роки тому +1

      Thanks for starting with Move Semantics.. looking forward for more about this..👍

    • @shaiavraham2910
      @shaiavraham2910 4 роки тому +1

      Can you make a video about the rule of 3 and the rule of 5 and how to implement them properly?

  • @shah.kairav
    @shah.kairav 2 роки тому +118

    In case anyone is wondering why there is only one "Destroyed" line being printed on Cherno's terminal, remember that his program halts due to "std::cin.get()". Once he presses Enter, he should see the other "Destroyed" message.
    Reason for two destroys: 1 where the hollow object is destroyed + 1 where the actual heap memory is deallocated.
    Hope this saves time for someone and helps!

    • @Mzkysti
      @Mzkysti 2 роки тому +5

      Thanks, I was getting two "Destroyed" and was like what the heck ;). Then I debugged it and the first one is destroying object with size of 0 and data as null, so I actually deduced this somehow myself too...

    • @frederikrandrup9222
      @frederikrandrup9222 2 роки тому +2

      Thanks! I was wondering exactly that. Saved me some googling

    • @pnuema1.618
      @pnuema1.618 Рік тому

      yeah I was wondering! saved me some time!

    • @alecmather
      @alecmather Рік тому +1

      Bless your soul...

    • @Mmmaris_Chan
      @Mmmaris_Chan Рік тому

      it helps! should read the comment first before figuring it out myself🤣

  • @mickaelfleurus9944
    @mickaelfleurus9944 4 роки тому +8

    I owe you a huge thank you ! I've been trying to understand what are lvalue and rvalue for quite a long time, and an even longer time for what the move semantic was all about, and I've finally understand it with your video.
    I'm in a big learning phase right now, and your channel is an awesome way to improve myself. Thanks for the good work !

  • @toddwasson3355
    @toddwasson3355 Рік тому +6

    Thank you so much for this move semantic vid. This has been wildly helpful to me today. Love your channel, your C++ playlist is by far my favorite of all C++ content.

  • @aqezzz
    @aqezzz 4 роки тому +1

    Thank you for this video! This is one of my favorite series on UA-cam and this is a topic that can be quite confusing but you simplified it beautifully. Great job and keep up the good work

  • @ericprincen3345
    @ericprincen3345 2 роки тому +15

    My first professional language was C++, and I moved from it in 1998 when I started working in Internet / Social media. I've moved back to writing low level code on hardware again, and I've been enjoying your videos a great deal. C++ has come a long way, and you've made my transition back a very easy one.
    BTW, I love the Hazel stuff too. Last time I worked with 3D graphics was when bsp trees were a new thing (and "fingering John Carmack" was something that was regularly done...) Fun to see how far that has all gone. I'm not doing any graphics right now, but fascinated with amount of forward movement in the field over the past 25 years.

    • @Brahvim
      @Brahvim 3 місяці тому

      Pointing fingers at sir John Carmack? Sounds like the DOS days to me!
      I'm sorry I'm asking this _TWO_ years later, but in your opinion, how fast is C++ at evolving?
      It is often called an ever-evolving language, and especially with us getting a new standard every third year, I, a beginner, feels the same way.
      Thoughts?
      I invite other veterans to answer, too!

  • @Norhther
    @Norhther 3 роки тому +73

    8:24 noexcept is important for performance reasons. In a talk I saw, the example presented was 60% faster using noexcept because of the nature of push_back operation in std::vector. So keep that in mind!

    • @IndyR0ck
      @IndyR0ck Рік тому +1

      what's the talk you saw? :)

    • @torstein5
      @torstein5 Рік тому +7

      @@IndyR0ck Probably this one: Back to Basics: Move Semantics (part 1 of 2) - Klaus Iglberger - CppCon 2019

    • @IndyR0ck
      @IndyR0ck Рік тому +3

      @@torstein5 thx!

  • @nabeelsherazi8860
    @nabeelsherazi8860 3 роки тому +4

    Holy shit. I thought I knew things. I don’t know anything. This channel has been such a blessing. Instant sub.

  • @iiTzLamar
    @iiTzLamar 4 роки тому +350

    m_Data = new char[m_Size] should be freed with delete [ ] m_Data; and not delete m_Data;

    • @gideonunger7284
      @gideonunger7284 4 роки тому +12

      It should also be m_Size + 1 when allocating for the null terminator

    • @Spirrwell
      @Spirrwell 4 роки тому +51

      @@gideonunger7284 Not necessarily. You don't need to store a null terminator if you know your string's size. Though it can be useful with C style string functions.
      But he should've used delete[] or maybe even allocated with a unique_ptr instead.

    • @txorimorea3869
      @txorimorea3869 4 роки тому +14

      That is good advice in general, however in this case is not necessary because the destructor of char is a no-operation. In this specific scenario is not necessary to call the destructor of every object in the array by calling delete[].

    • @gideonunger7284
      @gideonunger7284 4 роки тому +1

      @@Spirrwell yes sure if you don't work with any c string functions or pass that pointer to the outside it's fine. But it's still dangerous in c++ since the assumption of a char* is that it's null terminated. Rust doesn't use null termination but there it's the standard of the language so it's not a problem anywhere

    • @TheJackiMonster
      @TheJackiMonster 4 роки тому +6

      @@gideonunger7284 It's already dangerous to assume the const char* passed to strlen() will be null terminated. In C++ a compiler might add a null character to such values in double quotes but a C compiler won't do that implicitly which makes sense because you will know the length of a constant array of chars in your code already as developer.

  • @abdullahamrsobh
    @abdullahamrsobh 4 роки тому

    That video really came, when i needed it thanks Cherno

  • @alextiga8166
    @alextiga8166 4 роки тому +90

    This C++ series will never run out of topics to make a video about :)
    I've got too many requests what to cover in next videos.
    For example Multithreading: it would take forever to make videos about threads, locks, lock-free synchronization, fibers, coroutines etc.

    • @godnyx117
      @godnyx117 3 роки тому +7

      This didn't aged well...

    • @alextiga8166
      @alextiga8166 2 роки тому +1

      ​@@godnyx117 Oh yeah I expected this series to cover more advanced topics but had to do my own research on the topic instead.
      Still a very great series and the best C++ series there is on UA-cam!

  • @chawnneal159
    @chawnneal159 3 роки тому

    OMG! Ever since your view_string video, I've been obsessed with making my own string_view! After this video I was able to mimic some functionality via referencing the same memory! With some extra steps I can prevent writing! Thanks so much!!

  • @khoing1111
    @khoing1111 4 роки тому

    Founding this channel is a god damn blessing for me. Why did I not know about you earlier? Probably spent my whole life of luck on this.

  • @nallaprakash6901
    @nallaprakash6901 4 роки тому +8

    Man I was waiting for this from ages 😭😭😭😭, FINALLY Thanks Chernikov 😄

  • @Sala-lh9fu
    @Sala-lh9fu 3 роки тому

    Thank you so much fir being so thorough with your explanations! :)

  • @BillThaPill
    @BillThaPill 4 роки тому

    Need that part 2 reaction video bruh. U be preaching facts and I be feeling that. Keep up the good work my guy. Just run that reaction video for ya boy. You’re killing me Smalls

  • @CacheTaFace
    @CacheTaFace 4 роки тому

    Great explanation! BTW your hair looks great here

  • @DassVeryGood
    @DassVeryGood Рік тому

    This makes way more sense than what was being taught to me, where we just pushed multiple of the same object into a vector with different values (i.e. vec.push_back(Move{10})... vec.push_back(Move{n})). Sure it works, but doesn't help with visualizing the need to use a move constructor or semantics. This video helps so much, it just clicked instantly after watching this!

  • @lmnefg121
    @lmnefg121 3 роки тому

    really love your videos and i have learn a lot things from them

  • @poggly
    @poggly 3 роки тому

    This helped a lot, thank you!

  • @AugusteeeJoJo
    @AugusteeeJoJo 3 роки тому

    This is amazing! Thanks!

  • @grownupgaming
    @grownupgaming 2 роки тому

    Great video, very clear!

  • @TarunKumarSaraswat
    @TarunKumarSaraswat 3 роки тому

    Wow❤️ simplified to the core

  • @Ximaz-
    @Ximaz- 4 місяці тому

    I really enjoyed your video, thanks.

  • @xYuki91x
    @xYuki91x 4 роки тому +2

    Yesss, I've been waiting for this, THANK YOU :)
    Will you make a video on Return Value Optimization in the future? I don't really get that topic, my professors aren't good at explaining, but you are

  • @B4dD0GGy
    @B4dD0GGy 4 роки тому

    entertaining while *learning*, love it

  • @MKolbe-jh6yh
    @MKolbe-jh6yh 3 роки тому

    THANK YOU MY FRIEND! YOU JUST SAVED MY SEMESTER :D

  • @kamilkarwacki9590
    @kamilkarwacki9590 4 роки тому +2

    I learned so much about it but still dont know how to use it. So happy to see that you do a video on it as you always go very deep into these topics.

  • @ckacquah
    @ckacquah 4 роки тому

    Your videos always explain everything better 👍...
    Nice example

  • @filosofisto
    @filosofisto 4 роки тому

    Excelent explanation, thank you

  • @tannishkmankar3998
    @tannishkmankar3998 Рік тому

    Great you solved one headache for me, thanks

  • @jh-lp7cg
    @jh-lp7cg 4 роки тому +1

    Also, I believe any time the compiler can use Return Value Optimization do not try to use move semantics for return values. RVO will be more efficient.

  • @Albert-lr7ky
    @Albert-lr7ky Рік тому +12

    Very nice and excellent video!!! Tho I've got a small question: should we be usong "delete [ ] m_Data" in the destructor? Since it is created from "new [ ]"

    • @jamesbaguio2386
      @jamesbaguio2386 Рік тому +1

      Yes, the program needs to clean the continuous block of memory allocated to m_Data.

  • @JayAnAm
    @JayAnAm 4 роки тому +113

    Wow, naming a parameter "string" is quite... courageous:-)

    • @ianpan0102
      @ianpan0102 3 роки тому +24

      Unless you're using namespace std, it doesn't really matter.

    • @unsafecast3636
      @unsafecast3636 3 роки тому +24

      @Artem Katerynych
      #include
      using namespace std;
      string string(string string) {
      string string = string;
      }
      int main() {
      string string = “string”;
      string(string);
      }

    • @barmetler
      @barmetler 3 роки тому +23

      @@ianpan0102 Using namespace std is a cardinal sin anyway

    • @alphazero4587
      @alphazero4587 2 роки тому +15

      @@unsafecast3636 Bruh Bruh(Bruh);

    • @user-si9jy3zs1j
      @user-si9jy3zs1j 2 роки тому +2

      @@unsafecast3636 god

  • @mikewajda9912
    @mikewajda9912 4 роки тому

    Just found you channel and watched almost all of your c++ videos and some of your game engine series. Awesome job and thank you! Wanted to ask how you feel about rust compared to c++ and if you have had any experience with rust at all?

  • @user-ez2ze8he9u
    @user-ez2ze8he9u 4 роки тому +63

    4:40 should be delete [ ]

    • @TernaryM01
      @TernaryM01 4 роки тому +8

      He should've tested it on PVS-Studio to see if it can detect the memory leak.

    • @abdallahrashed1947
      @abdallahrashed1947 4 роки тому

      what is the difference ?

    • @Zatmos
      @Zatmos 4 роки тому +1

      @@abdallahrashed1947 "delete" destroys a dynamically allocated object and "delete[]" destroys a dynamically allocated array

    • @jinchengzhang25
      @jinchengzhang25 3 роки тому

      @@TernaryM01 underrated comment lol

  • @Idlecodex
    @Idlecodex 4 роки тому

    Man... God bless you! :)

  • @shubham91219
    @shubham91219 4 роки тому +5

    Hey Cherno, could you please make some videos on lock free programming and memory ordering as well? Thanks for all the great content so far.

    • @KishoreG2396
      @KishoreG2396 4 роки тому

      Memory ordering is a very tricky subject.

  • @giannitedesco6153
    @giannitedesco6153 3 роки тому +4

    You can do printf("%.*s
    ", (int)m_Size, m_Data); rather than that printf loop - it's easier, more efficient, and won't b0rk when you call it from multiple threads since the single call will happen under the stdout lock.

  • @supersquare
    @supersquare 4 роки тому +1

    Thank you so much Cherno!! You're seriously the best 😊

  • @halaszka2949
    @halaszka2949 2 роки тому

    I KISS YOUR EYES! I didnt unterstand it with my book, but then i found you. R Value Refenrences and Move Semantics are very usefull

  • @hamdaman3593
    @hamdaman3593 4 роки тому +25

    Yes the ps5 part 2 is coming this weekend, whose looking forward to that

  • @karandutt4534
    @karandutt4534 3 роки тому +1

    Hello Cherno, please keep uploading new features of C++ 11/14/17/20.
    Your content is great.

  • @Toccobass13
    @Toccobass13 3 роки тому

    Thank you!

  • @AllothTian
    @AllothTian 4 роки тому

    It's worth noting that we need to make the moved-from string "hollow" because its original constructor will still fire. In essence, a moved-from object can have multiple instances of its destructor being fired. This, as you can imagine, is rather inefficient. The alternative is what's called a "destructive move," but the design committee of the language couldn't figure out a way to make that fit with the existing object model. For the curious, you can look up Howard Hinnant's and Sean Parent's posts on this matter.

  • @rafalmichalski4893
    @rafalmichalski4893 4 роки тому

    Less typing with "puts" (it adds '
    "), so no need to use printf only to print non-formatted string with "
    " at the end. Anyway great material Cherno.

  • @user-nx5ob7ny4l
    @user-nx5ob7ny4l 2 роки тому

    u give a human touch to a very dry and difficult topic , very helpfull

  • @yohan7027
    @yohan7027 4 роки тому

    Should you use move with functions?
    Let's say:
    std::vector add( std::vector a, std::vector b) { ... }
    and I need to use whatever is passed into a and b later, is it better to pass by reference or move? I know that anything moved shouldn't be used again, so is there a way to move back after the function is done? Like making the parameter a const move or something?
    I ran some trials and move was faster than reference (is that true?) but it's pointless if it leads to undefined behavior.

  • @Nick-tv5pu
    @Nick-tv5pu 9 місяців тому

    Great video, I always look forward to your stuff.
    That said, at 0:53 isn't that what references (pointers) are for? You don't have to copy a value to/from a function if you just pass/receive a pointer?

  • @cole-nyc
    @cole-nyc 4 роки тому +85

    Great video! one comment though: When you heap-allocate an array you have to free it with 'delete[]' instead of 'delete'. Your code frees only the first element of the array.

    • @KishoreG2396
      @KishoreG2396 4 роки тому +1

      Technically its UB with char* string literals

    • @charoniv5631
      @charoniv5631 2 роки тому

      what really?

    • @tolkienfan1972
      @tolkienfan1972 Рік тому +1

      According to the standard, using delete instead of delete[] is UB. In practice, both delete and delete[] are simply forwarded to the libc function "free", and therefore end up behaving the same. Of course I an NOT advocating using delete instead od delete[], that would be terrible practice. But there isn't an implementation out there that only frees the first element. In fact there isn't a function you could use to only free the first element. Even realloc won't do that.

    • @Flinsch77
      @Flinsch77 Рік тому +1

      With `delete` instead of `delete[]`, the whole array gets freed, no problem so far, but only one destructor might be called: that of the first element. This doesn't matter in the case of a `char` array, but it can be relevant for more complex objects, which in turn might allocate their own memory (which would then have to be freed again).

    • @tolkienfan1972
      @tolkienfan1972 Рік тому +1

      @@Flinsch77 that is correct. Thanks for that

  • @JJFoxLegacy
    @JJFoxLegacy 4 роки тому +7

    Dude loved the ps5 video, can't wait for the next part !!!

  • @267praveen
    @267praveen 4 роки тому +2

    Finally ... It's here. Thanks Cherno.
    Next awaited .....
    Regex
    SFINAE
    Random engines

  • @valizeth4073
    @valizeth4073 4 роки тому

    What made you switch to printf over streams? Personally I always use fmtlib, and I can see that printf is quite similar, but why tho?

  • @DIYGuy85
    @DIYGuy85 4 роки тому

    Can someone please give this guy an award!

  • @tannishkmankar3998
    @tannishkmankar3998 Рік тому

    Still working as of today, ty!

  • @Swonkasaur
    @Swonkasaur 4 роки тому

    Thank you for the free 2 months of skill share ;D

  • @GreenFlame16
    @GreenFlame16 4 роки тому +1

    Hey, Cherno, the video after Static Analysis in C++ is now marked as private. Was that intentional? Or was it also on move semantics but now you're redoing it and thus removed the old one? Loving your content!

  • @HamidMehr
    @HamidMehr 2 роки тому

    So after attempting to learn move semantics/rvalue references for n times ( n >= 100) this finally clicked. Thanks, Cherno!

  • @shefman200
    @shefman200 4 роки тому

    Ayo my g we respect your regular content...but we want that that ps5 part 2

  • @tomwhitcombe7621
    @tomwhitcombe7621 4 роки тому +2

    Literally just watched your lval rval video an hour ago. Good timing :)

  • @alexbutane5550
    @alexbutane5550 3 роки тому +1

    Do all containers in modern C++ have move constructors and move assignment operators by default? and if so how do you use them?

  • @erenenadream
    @erenenadream Рік тому

    Hey I want to ask a question about copy constructor that you have coded. In an example like this:
    String first("The first string");
    String second("The second string");
    first = second;
    Will the code above cause memory leak because of the copy constructor that you have written? The copy constructor allocates new memory all the time but it doesn't delete the old one if it's exist. @TheCherno

  • @philpesce
    @philpesce 2 роки тому

    I followed along and at the 11:50 mark, where you change the String&& cast to using std::move, the result is the copy constructor returns to being used. Any ideas why this could be?

  • @MadpolygonDEV
    @MadpolygonDEV Рік тому

    im confused about following, when setting other.size =0 arent we also setting our copied data to 0 since we re pointing to the same value? Am I correct to assume that when we use the && function we should think about the variables as pointers instead of references in a sense that were purely assigning pointers now and arent changing the values directly, only the addresses.

  • @MrSebaleme
    @MrSebaleme 2 роки тому

    When you are running your code at 11:40, the compiler still choose the copy constructor over the move constructor. Would it work if you explicitly forbid your copy constructor to accept rvalues, by making the input parameter not const (line 15)?

  • @xxx489Rockstar984xxx
    @xxx489Rockstar984xxx 4 роки тому

    He finally did it

  • @delulu6969
    @delulu6969 4 роки тому +1

    I'm new to coding/programming. I started with JS and PHP. Along the way I learn OOP, and design patterns. Accidentally, I learn to understand Java and C++ syntax thanks to UA-cam video suggestions like this. Thank you!😊

  • @gvcallen
    @gvcallen 4 роки тому +3

    I don't think I've ever been so excited to watch a C++ video before xD. They should put you on Netflix Cherno! ;)

  • @sumitgupta7553
    @sumitgupta7553 8 місяців тому

    Hi Cherno, you are just amazing.. Well described. But can you help me in finding out where I'm getting wrong, when I say we can do the work, you done in move constructor, in the copy constructor even in that constructor we only getting reference of the object, then what is the need to define separately!

  • @alexandrumarcel3696
    @alexandrumarcel3696 Рік тому +1

    if we use the new[] operator for allocating memory for m_Data, shouldn't we use the delete[] operator in the Destructor, or am I missing something ?

  • @StrangeIndeed
    @StrangeIndeed 4 роки тому

    Good stuff

  • @muhammadaamirzaman
    @muhammadaamirzaman 4 роки тому +2

    Top class teacher for Cpp

  • @maniaharshil
    @maniaharshil 6 місяців тому

    This is freaking greatest explanations ever for move sementic with demo : this explains whats going on underneath actually!! And how move sementic helpful in performance

  • @musicplaylist3550
    @musicplaylist3550 4 роки тому +1

    These videos are here to stay to help people even 5+ years from now 😨

  • @mynechan
    @mynechan 4 роки тому

    I have a question, when we are using std::string& and then assigning our data to that (means copying it) [myClass(std::string& str) : myStr(str) { }] CLion gives suggestion to use this [myClass(std::string str) : myStr { std::move(str) } { }]. Is there a reason?

  • @adamhendry945
    @adamhendry945 5 місяців тому

    At 5:15, can you confirm, do we need the copy constructor because the default `String` constructor will only copy the `m_Data` pointer, but not its contents (as you mentioned in your Copy Constructor video)? I was a little confused at first because `String m_Name` in `Entity` is not a pointer.

  • @nabil41854
    @nabil41854 3 роки тому +2

    Thanks for the great explanation. I just have a note, you are moving the curser a lot making it a bit difficult to follow. cheers

  • @activex7327
    @activex7327 Рік тому +1

    You should explain the explicit std::move() call in entity ctor. If you look at the ctor of entity it already accepts rvalue so why explicit move if the signatures of entity ctor and string ctor match. Why is function overloading not working here all the way down?

  • @ivanpolyakov5746
    @ivanpolyakov5746 4 роки тому

    Excellent example with string!

  • @ZhangYingtiden
    @ZhangYingtiden 4 роки тому

    Sorry if my question is too obvious... still learning the basics.
    What happens if in the move constructor, you cannot mutate the m_Data field of your temporary rvalue object?
    For example, if the String class declares the m_Data field as "const char *const m_Data", then you wouldn't be allowed to assign nullptr to the rvalue object. Should we just avoid doing (sometype *const) in general in C++? Or is there a workaround for this?

  • @bipingosain6870
    @bipingosain6870 4 роки тому

    Greate Video! Can you please do a series or at least a video to give an overview of how to get started with Authoritative Multiplayer Code with C++?

  • @jm10oct
    @jm10oct 3 роки тому +1

    what is the meaning of String() = default? what is the " = default" do?

  • @tahaqtr7439
    @tahaqtr7439 3 роки тому

    What was that syntax when he did Entity entity (String("Cherno"));
    What function is String ()?

  • @Omnifarious0
    @Omnifarious0 4 роки тому +2

    You missed pointing out that if you have a true temporary it will also use the move constructor without needing ::std::move

  • @Xameska
    @Xameska 4 роки тому +1

    any chance of a map/unordered_map, with hashing/compare function creation for custom key types tutorial?

  • @RaonCreate
    @RaonCreate 3 роки тому

    well done explained

  • @alecmather
    @alecmather Рік тому +2

    One thing I ran into while going through this video (apologies for my novice) is that you're using this shorthand syntax to assign the Entity->m_Name property in the constructor by doing ": m_Name(name)". Out of curiosity, I tried doing it the way I'm familiar with (just a normal "m_Name = name") inside the body of the Entity constructor, and this caused an error in the destructor of the String class. No idea why/how these two property assignments are different, probably worth an explanation somewhere? Thanks again for making awesome videos!

    • @alexandrumarcel3696
      @alexandrumarcel3696 Рік тому +1

      the difference between ":m_Name(name)" outside of the actual Constructor body and "m_Name = name" is that the first one is calling the Copy Constructor and the second one is calling the Operator = of the String class. Since there is no overloaded version of the operator = the compiler uses the default version provided by the compiler, but as the compiler doesn't know how you want to treat your pointer variable (m_Data) it just simply doing a shallow copy. So "m_Name = name" is basically assigning the pointer name.m_Data to m_Name.m_Data (m_Name.m_Data = name.m_Data), which will result in both name and m_Name pointing to the same address. So when "name" goes out of scope and the Destructor gets called, this will result in "m_Name.m_Data" being a dangling pointer, so when the m_Name object's Destructor gets called it will try to delete the pointer m_Name.m_Data which has been previously deleted when "name" got out of scope. Or at least this is I think happened :D Try to overload the operator = if you want to use the "m_Name = name" version

    • @alecmather
      @alecmather Рік тому

      @@alexandrumarcel3696 you're a G for this explanation lol I also found that he later does a whole video on this difference which also helped a lot, thank you!!

  • @mkhadka123
    @mkhadka123 Рік тому

    Ok my head is spinning now

  • @meirklemfner114
    @meirklemfner114 4 роки тому

    My goodness! I didn't know the last part...

  • @Prashantkumar-pn6qq
    @Prashantkumar-pn6qq 3 роки тому

    Hi Cherno, Is move semantics just a shallow copy and setting other's pointers to null?

  • @yousefali995
    @yousefali995 Рік тому

    4:41 why using delete to deallocate an array of characters? is it ok?

  • @Han-ve8uh
    @Han-ve8uh 7 місяців тому

    1. 11:14 When was the old string destroyed? Can someone point the the line of code or trace the lifecycle of which functions are called/objects are created/destroyed?

  • @sanjeevkant8470
    @sanjeevkant8470 2 роки тому

    If your c-styled string doesn't have null terminating character, then how your strlen() is working, because as I know strlen() also requires null terminating character for its implicit calculation of number of characters in a c-styled string... Can you please clarify!!

  • @gabrielbraz9669
    @gabrielbraz9669 Рік тому

    4:47 shouldn't he have used the delete[] operator instead?
    Also, couldn't I achive the same result using the copy constructor? If I use the same code of the move constructor inside the copy one, I would still be passing the pointer to the block of data and erasing the old pointer so it doesn't delete de buffer. Or am I wrong? But if you need both copy and move construtor to be on the same class, then I understand the need of it.

  • @john_codes
    @john_codes 4 роки тому +30

    Everyone: RELEASE PT 2 OF THE PS5 REACTION VIDEO
    Cherno: Here's a c++ move semantics video.
    Lol just kidding. I know he's releasing the video on Saturday. Can't wait!

    • @redscorpion9325
      @redscorpion9325 4 роки тому +2

      John True Statement,this popped up and I was like where PS5 part 2 video everyone is waiting for😁

    • @redscorpion9325
      @redscorpion9325 4 роки тому

      How do you know its being released on Saturday?

    • @Optamizm
      @Optamizm 4 роки тому

      @M. de k., could be the Discord?

    • @john_codes
      @john_codes 4 роки тому

      @@redscorpion9325 go to his channel and look at his community post. He said it's coming on Saturday:)

  • @ameynaik2743
    @ameynaik2743 2 роки тому

    Take aways
    1. Move constructor takes rval reference.
    2. Instead of type casting var to rval using (T&&) var, we can use std::move(var)
    const T & takes both rval and lval but if rval is provided to this, it calls copy constructor because intermediate temporary variable is created. To avoid this we use move constructor.

    • @_Omni
      @_Omni Рік тому

      Casting to xvalue

  • @Dante3085
    @Dante3085 4 роки тому +1

    5:35 Shouldn't we also delete[] m_data for this String, before we put the other String's data on it ?
    EDIT: I am sorry. At construction time the this String obviously can't have any data that we need to delete before assigning other's data.

  • @joshuaeirman2197
    @joshuaeirman2197 3 роки тому

    Thank you, Cherno. For something like this, the code to look at as a text file would be worthwhile. How about it?

  • @thomasbake
    @thomasbake 2 роки тому

    Hi community!
    I have a quick question...
    Why do we need to create a copy constructor of String if the parametrized constructor of Entity gets the String object passed by reference? In practice, I would create the copy constructor of the String object anyways but I'm curious what is going on internally...

    • @Evan490BC
      @Evan490BC 2 роки тому

      Because you don't want the copy constructor automatically created by the compiler itself. This will only perform shallow copying. (In general, if you have pointer member variables you need to provide a copy constructor of your own.)

  • @jonsnow8543
    @jonsnow8543 3 роки тому

    shouldn't it be
    m_size = strlen(string) + 1; ?
    The next line with new char[m_size] is going to be under-sized, because strlen does not include the null term in reporting the length, therefore need to add 1 more to store it. Non?