C++编程中new运算符的使用学习教程

2020-01-06 14:17:52王冬梅


// expre_new_Operator.cpp
// compile with: /EHsc
#include <string.h>

class CName {
public:
  enum {
   sizeOfBuffer = 256
  };

  char m_szFirst[sizeOfBuffer];
  char m_szLast[sizeOfBuffer];

public:
  void SetName(char* pszFirst, char* pszLast) {
   strcpy_s(m_szFirst, sizeOfBuffer, pszFirst);
   strcpy_s(m_szLast, sizeOfBuffer, pszLast);
  }

};

int main() {
  // Allocate memory for the array
  char* pCharArray = new char[CName::sizeOfBuffer];
  strcpy_s(pCharArray, CName::sizeOfBuffer, "Array of characters");

  // Deallocate memory for the array
  delete [] pCharArray;      
  pCharArray = NULL;

  // Allocate memory for the object
  CName* pName = new CName;
  pName->SetName("Firstname", "Lastname");

  // Deallocate memory for the object
  delete pName;
  pName = NULL;
}

如果使用 new 运算符的放置新形式(带有参数和分配大小的形式),如果构造函数引发异常,则编译器不支持 delete 运算符的放置形式。 例如:


// expre_new_Operator2.cpp
// C2660 expected
class A {
public:
  A(int) { throw "Fail!"; }
};
void F(void) {
  try {
   // heap memory pointed to by pa1 will be deallocated
   // by calling ::operator delete(void*).
   A* pa1 = new A(10);
  } catch (...) {
  }
  try {
   // This will call ::operator new(size_t, char*, int).
   // When A::A(int) does a throw, we should call
   // ::operator delete(void*, char*, int) to deallocate
   // the memory pointed to by pa2. Since
   // ::operator delete(void*, char*, int) has not been implemented,
   // memory will be leaked when the deallocation cannot occur.

   A* pa2 = new(__FILE__, __LINE__) A(20);
  } catch (...) {
  }
}

int main() {
  A a;
}

初始化使用 new 运算符分配的对象
可选的 initializer 字段包含在 new 运算符的语法中。 这样就可以使用用户定义的构造函数来初始化新对象。 有关如何执行初始化的详细信息,请参阅初始值设定项。 以下示例演示如何将初始化表达式与 new 运算符一起使用:


// expre_Initializing_Objects_Allocated_with_new.cpp
class Acct
{
public:
  // Define default constructor and a constructor that accepts
  // an initial balance.
  Acct() { balance = 0.0; }
  Acct( double init_balance ) { balance = init_balance; }
private:
  double balance;
};

int main()
{
  Acct *CheckingAcct = new Acct;
  Acct *SavingsAcct = new Acct ( 34.98 );
  double *HowMuch = new double ( 43.0 );
  // ...
}

在此示例中,使用 CheckingAcctnew 运算符分配了 对象,但未指定默认初始化。 因此,调用了类的默认构造函数 Acct()。 然后,以相同的方式分配了对象 SavingsAcct,只不过将它显式初始化为 34.98。 由于 34.98 是类型 double,因此调用了采用该类型的参数的构造函数来处理初始化。 最后,将非类类型 HowMuch 初始化为 43.0。