Allocation as default initialization












6















Say I have a struct (or class) with a dynamic array, its length, and a constructor:



struct array {
int l;
int* t;
array(int length);
};

array::array(int length) {
l=length;
t=new int[l];
}


I assume everything so far is legal: this is how I would write it (although it maybe not be the only way to do things), but I have seen the following code, that somewhat seems to work:



struct array {
int l;
int* t = new int[l];
array(int length);
}

array::array(int length) {
l=length;
}


It looks bad, so I wonder if this works out of sheer luck and undefined behaviors, or if there is some internal rule that makes this code work fine.










share|improve this question



























    6















    Say I have a struct (or class) with a dynamic array, its length, and a constructor:



    struct array {
    int l;
    int* t;
    array(int length);
    };

    array::array(int length) {
    l=length;
    t=new int[l];
    }


    I assume everything so far is legal: this is how I would write it (although it maybe not be the only way to do things), but I have seen the following code, that somewhat seems to work:



    struct array {
    int l;
    int* t = new int[l];
    array(int length);
    }

    array::array(int length) {
    l=length;
    }


    It looks bad, so I wonder if this works out of sheer luck and undefined behaviors, or if there is some internal rule that makes this code work fine.










    share|improve this question

























      6












      6








      6








      Say I have a struct (or class) with a dynamic array, its length, and a constructor:



      struct array {
      int l;
      int* t;
      array(int length);
      };

      array::array(int length) {
      l=length;
      t=new int[l];
      }


      I assume everything so far is legal: this is how I would write it (although it maybe not be the only way to do things), but I have seen the following code, that somewhat seems to work:



      struct array {
      int l;
      int* t = new int[l];
      array(int length);
      }

      array::array(int length) {
      l=length;
      }


      It looks bad, so I wonder if this works out of sheer luck and undefined behaviors, or if there is some internal rule that makes this code work fine.










      share|improve this question














      Say I have a struct (or class) with a dynamic array, its length, and a constructor:



      struct array {
      int l;
      int* t;
      array(int length);
      };

      array::array(int length) {
      l=length;
      t=new int[l];
      }


      I assume everything so far is legal: this is how I would write it (although it maybe not be the only way to do things), but I have seen the following code, that somewhat seems to work:



      struct array {
      int l;
      int* t = new int[l];
      array(int length);
      }

      array::array(int length) {
      l=length;
      }


      It looks bad, so I wonder if this works out of sheer luck and undefined behaviors, or if there is some internal rule that makes this code work fine.







      c++ constructor






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked 2 hours ago









      tarulentarulen

      1,747412




      1,747412
























          2 Answers
          2






          active

          oldest

          votes


















          11














          This code is not correct.



          int* t = new int[l]; will happen before l=length;, thus reading the uninitialized variable l. Member initializers are handled before the constructor's body runs.



          array::array(int length) : l{length} {}


          instead would work because l is declared before t.



          However, doing this "by hand" is a bad idea to begin with. You should be using std::vector.






          share|improve this answer































            4














            The 2nd code snippet might have undefined behavior.



            The data members are initialized at the order of how they're declared. For class array, when t is initialized l is not initialized yet. For objects with automatic and dynamic storage duration l will be initialized to indeterminate value, then the usage of l (i.e. new int[l]) leads to UB.



            Note that l=length; inside the body of the constructor is just assignment; the initialization of data members has been finished before that.



            BTW: With member initializer list the 1st code snippet chould be rewritten as



            array::array(int length) : l(length), t(new int[l]) {
            }





            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%2f54399900%2fallocation-as-default-initialization%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









              11














              This code is not correct.



              int* t = new int[l]; will happen before l=length;, thus reading the uninitialized variable l. Member initializers are handled before the constructor's body runs.



              array::array(int length) : l{length} {}


              instead would work because l is declared before t.



              However, doing this "by hand" is a bad idea to begin with. You should be using std::vector.






              share|improve this answer




























                11














                This code is not correct.



                int* t = new int[l]; will happen before l=length;, thus reading the uninitialized variable l. Member initializers are handled before the constructor's body runs.



                array::array(int length) : l{length} {}


                instead would work because l is declared before t.



                However, doing this "by hand" is a bad idea to begin with. You should be using std::vector.






                share|improve this answer


























                  11












                  11








                  11







                  This code is not correct.



                  int* t = new int[l]; will happen before l=length;, thus reading the uninitialized variable l. Member initializers are handled before the constructor's body runs.



                  array::array(int length) : l{length} {}


                  instead would work because l is declared before t.



                  However, doing this "by hand" is a bad idea to begin with. You should be using std::vector.






                  share|improve this answer













                  This code is not correct.



                  int* t = new int[l]; will happen before l=length;, thus reading the uninitialized variable l. Member initializers are handled before the constructor's body runs.



                  array::array(int length) : l{length} {}


                  instead would work because l is declared before t.



                  However, doing this "by hand" is a bad idea to begin with. You should be using std::vector.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered 2 hours ago









                  Baum mit AugenBaum mit Augen

                  40.9k12117152




                  40.9k12117152

























                      4














                      The 2nd code snippet might have undefined behavior.



                      The data members are initialized at the order of how they're declared. For class array, when t is initialized l is not initialized yet. For objects with automatic and dynamic storage duration l will be initialized to indeterminate value, then the usage of l (i.e. new int[l]) leads to UB.



                      Note that l=length; inside the body of the constructor is just assignment; the initialization of data members has been finished before that.



                      BTW: With member initializer list the 1st code snippet chould be rewritten as



                      array::array(int length) : l(length), t(new int[l]) {
                      }





                      share|improve this answer






























                        4














                        The 2nd code snippet might have undefined behavior.



                        The data members are initialized at the order of how they're declared. For class array, when t is initialized l is not initialized yet. For objects with automatic and dynamic storage duration l will be initialized to indeterminate value, then the usage of l (i.e. new int[l]) leads to UB.



                        Note that l=length; inside the body of the constructor is just assignment; the initialization of data members has been finished before that.



                        BTW: With member initializer list the 1st code snippet chould be rewritten as



                        array::array(int length) : l(length), t(new int[l]) {
                        }





                        share|improve this answer




























                          4












                          4








                          4







                          The 2nd code snippet might have undefined behavior.



                          The data members are initialized at the order of how they're declared. For class array, when t is initialized l is not initialized yet. For objects with automatic and dynamic storage duration l will be initialized to indeterminate value, then the usage of l (i.e. new int[l]) leads to UB.



                          Note that l=length; inside the body of the constructor is just assignment; the initialization of data members has been finished before that.



                          BTW: With member initializer list the 1st code snippet chould be rewritten as



                          array::array(int length) : l(length), t(new int[l]) {
                          }





                          share|improve this answer















                          The 2nd code snippet might have undefined behavior.



                          The data members are initialized at the order of how they're declared. For class array, when t is initialized l is not initialized yet. For objects with automatic and dynamic storage duration l will be initialized to indeterminate value, then the usage of l (i.e. new int[l]) leads to UB.



                          Note that l=length; inside the body of the constructor is just assignment; the initialization of data members has been finished before that.



                          BTW: With member initializer list the 1st code snippet chould be rewritten as



                          array::array(int length) : l(length), t(new int[l]) {
                          }






                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited 2 hours ago

























                          answered 2 hours ago









                          songyuanyaosongyuanyao

                          90.5k11171234




                          90.5k11171234






























                              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%2f54399900%2fallocation-as-default-initialization%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

                              What are all the squawk codes?

                              What are differences between VBoxVGA, VMSVGA and VBoxSVGA in VirtualBox?

                              Hudsonelva