Copy Constructor May Not Be Generated
Important This document may not represent best practices for current development, links to downloads and other resources may no longer be valid. Current recommended version can be found here. ArchiveDisclaimer

Copy Constructor May Not Be Generated

The C++ standard says that a copy constructor will be called when an object is moved, such that, an object will be created and destroyed at the same address.

However, when compiling with /clr, and when a function compiled to MSIL calls a native function, passing one or more native classes by value, and where the native class has a copy constructor and/or destructor, no copy constructor will be called and the object will be destroyed at a different address than where it was created.

This could result in problems if the class has a pointer into itself, or if the code is tracking objects by address.

For more information, see /clr (Common Language Runtime Compilation).


The following sample demonstrates when a copy constructor will not be generated.

// breaking_change_no_copy_ctor.cpp
// compile with: /clr

struct S {
   int i;
   static int n;

   S() : i(n++) { 
      printf_s("S object %d being constructed, this=%p\n", i, this); 

   S(S const& rhs) : i(n++) { 
      printf_s("S object %d being copy constructed from S object "
               "%d, this=%p\n", i, rhs.i, this); 

   ~S() {
      printf_s("S object %d being destroyed, this=%p\n", i, this); 

int S::n = 0;

#pragma managed(push,off)
void f(S s1, S s2) {
   printf_s("in function f\n");
#pragma managed(pop)

int main() {
   S s;
   S t;

See Also

© 2016 Microsoft