char * t = new char和char * t = new char [10]之间有什么不同;

时间:2010-10-23 22:00:41

标签: c++ pointers

  

可能重复:
  What's the difference between new char[10] and new char(10)

之间有什么不同
char* t1=new char

char* t2=new char[10];

分配内存并且t1 [100] ='m'和t2 [100] ='m'对他们来说是正确的

-----------编辑后:

但是为什么我们可以使用t1 [100]如果t1被动态分配char而不是char数组

3 个答案:

答案 0 :(得分:4)

您的第一个案例创建一个char元素(1个字节),而您的第二个案例创建10个连续的char个元素(10个字节)。但是,在两种情况下都未定义t(x)[100]='m'的访问权限。也就是说,您在指针位置之后请求100个字节,这很可能是垃圾数据。

换句话说,你对'm'的赋值将覆盖已存在的任何内容,这可能是来自另一个数组的数据。因此,您可能会在运行时遇到一些奇怪的错误。

C / C ++允许程序员访问超出范围的数组,因为数组实际上只是指向连续内存的指针。约定t1[100]只是指针后的100个字节,无论是什么。

如果您想要“安全”数组,请使用vector类并调用at()函数。如果访问无效,这将抛出out_of_range异常。

Stroustrup给出了以下示例:

template<class T> class Vec : public vector<T> {
public:
    Vec() : vector<T>() {}
    Vec(int s) : vector<T>(s) {}

    T& operator[] (int i) {return at(i);}
    const T& operator[] (int i) const {return at(i);}
};

这个类是边界安全的。我可以这样使用它:

Vec<char> t3(10);                // vector of 10 char elements
try {
    char t = t3[100];            // access something we shouldn't
}
catch (out_of_range) {
    cerr << "Error!" << endl;    // now we can't shoot ourselves in the foot
}

答案 1 :(得分:3)

您需要delete这些不同,因为数组是使用operator new的不同变体分配的:

delete t1;
delete [] t2;

答案 2 :(得分:0)

t1指向动态分配的char; t2指向动态分配的10个字符的数组。但我相信这是C ++,而不是C.这绝对是重复的。

OP编辑后的修订 p [n]其中p是一个指针,n是一个整数,相当于*(p + n),因此它就像从你的p指向的那样访问100个字符。在你的两种情况下(t1和t2),第100个(第101个)元素超出了你的所有权,所以它是UB。实际上,上述事实使2[array]可以与array[2]互换。想要,但不要那样做:)