当我修改,改变和“删除”原始指针时,是否需要指针复制?

时间:2017-06-16 10:22:57

标签: c++ pointers

Rao (2012, p. 180, listing 8.9)说"在第10行中创建副本的原因是循环通过增量运算符(++)修改正在使用的指针。新的返回的原始指针需要在第26行中对应的delete[]完整地存储,需要使用new返回的地址调用,而不是任何随机值"。

0: #include <iostream>
1: using namespace std;
2:
3: int main()
4: {
5: cout << “How many integers you wish to enter? “;
6: int InputNums = 0;
7: cin >> InputNums;
8:
9: int* pNumbers = new int [InputNums]; // allocate requested integers
10: int* pCopy = pNumbers;
11:
12: cout<<“Successfully allocated memory for “<<InputNums<< “ integers”<<endl;
13: for(int Index = 0; Index < InputNums; ++Index)
14: {
15: cout << “Enter number “<< Index << “: “;
16: cin >> *(pNumbers + Index);
17: }
18:
19: cout << “Displaying all numbers input: “ << endl;
20: for(int Index = 0, int* pCopy = pNumbers; Index < InputNums; ++Index)
21: cout << *(pCopy++) << “ “;
22:
23: cout << endl;
24:
25: // done with using the pointer? release memory
26: delete[] pNumbers;
27:
28: return 0;
29: }

pCopy真的有必要吗?我错过了什么? 在下面的修改示例中,我不使用它,delete[]似乎工作正常。

#include <iostream>    
using namespace std;

int main()
{

    cout << "How many integers do you want? " << endl;
    int InputN = 0;
    cin >> InputN;

    int* pNumbers = new int [InputN];

    cout << "allocated memory for  " << InputN << " integers"  << endl;

    for (int Idx = 0; Idx < InputN; Idx++) {
        cout << "enter number for index " << Idx << endl;
        cin >> *(pNumbers + Idx);
    }

    cout << "Display all input numbers: "  << endl;


    for (int Idx = 0; Idx < InputN + 2; ++Idx) {
        cout << "integer with index: " <<  Idx << " has  value " << *(pNumbers + Idx) << " and pointer: " << pNumbers + Idx << endl;
        //cout << pNumbers - 50000 << " points to " << *(pNumbers - 50000) << endl;
        }

    delete[] pNumbers;

    cout << "after the delete: " << endl;
    for (int Idx = 0; Idx < InputN + 2; ++Idx) {
        cout << "integer with index: " <<  Idx << " has  value " << *(pNumbers + Idx) << " and pointer: " << pNumbers + Idx << endl;
        //cout << pNumbers - 50000 << " points to " << *(pNumbers - 50000) << endl;
        }

    return 0;
}

1 个答案:

答案 0 :(得分:3)

在以下情况

{
  type* ptr = new type[size];      // line A
  /*
     some code, for example
     ptr++;                        // legal but dangerous/bad
  */
  delete[] ptr;                    // line B
}

变量ptr的值,即指向的地址,在行AB中必须相同。否则,这是未定义的行为并导致崩溃(如果你很幸运)。在第二个代码清单中,不使用指针变量来循环遍历元素,而是使用索引。因此,原始指针永远不会改变,你满意的条件。

确保有多种方法可以满足此要求。

  1. 您可以将指针声明为const

    {
      type * const ptr = new type[size];  // not: type const*ptr
      // ptr++;                           // illegal: would give a compiler error
      delete[] ptr;
    }
    
  2. 您可以使用smart pointer

    {
      std::unique_ptr<type[]> ptr = new type[size];
      /* some code */
    }   // memory is automatically freed at end of scope of ptr
    
  3. 您可以使用容器,例如std::vector

    {
      std::vector<type> vec(size);
      /* some code */
    }   // memory is automatically freed at end of scope of ptr
    
  4. 最后一个选项是最方便的,因为它还允许您更改分配的内存量,或添加超出最初分配的内存的元素(当向量自动重新分配和扩展时)。