有这样一种类型std::size_t.它可以用于描述对象的大小,因为它可以保证能够表达任何对象的最大大小(因此在这里写).但是,这是什么意思?我们实际上没有内存中的对象.那么这是否意味着这种类型可以存储一个整数,代表我们理论上可以使用的最大内存量?
如果我尝试写类似的东西
size_t maxSize = std::numeric_limits<std::size_t>::max();
new char[maxSize];
Run Code Online (Sandbox Code Playgroud)
我会得到一个错误,因为数组的总大小限制为0x7fffffff.为什么?而且,如果我传递一个等于的非常量表达式maxSize,std::bad_array_new_length将被抛出.如果我传递的表达式小于maxSize但仍然大于0x7fffffff,std::bad_alloc则会抛出.我想这std::bad_alloc是因为内存不足而引发的,不是因为大小大于0x7fffffff.为什么会这样?我想如果我们分配的内存大小大于0x7fffffff(这是在编译时传递给new []的const的最大值),抛出一个特殊异常是很自然的.为什么std::bad_array_new_length只有在我通过时才被抛出maxSize?这种情况特别吗?
顺便说一下,如果我将maxSize传递给vector的构造函数,如下所示:
vector<char> vec(maxSize);
Run Code Online (Sandbox Code Playgroud)
std::bad_alloc将被抛出,而不是std::bad_array_new_length.这是否意味着vector使用不同的分配器?
我正在尝试自己实现数组.使用unsigned int来存储大小,容量和索引是一种糟糕的方法.所以定义一些这样的别名是个好主意:
typedef std::size_t size_type;
Run Code Online (Sandbox Code Playgroud)
用size_type而不是unsigned int?
我想尝试外部链接和不完整的类型声明,并写了这个例子:
Source.cpp:
//Source.cpp
class A {
public:
int a=10;
};
A* var1 = new A();
void printA(A* arg)
{
cout << arg->a << endl;
}
Run Code Online (Sandbox Code Playgroud)
Source1.cpp:
//Source1.cpp
class A
{
public:
int b = 20;
int c = 30;
};
A* var2 = new A();
void printB(A* a)
{
std::cout << a->b;
}
Run Code Online (Sandbox Code Playgroud)
main.cpp中:
//main.cpp
class A;
extern A* var1;
extern A* var2;
int main()
{
void printA(A*);
void printB(A*);
printA(var1); //Prints 10
printA(var2); //Prints 10
printB(var2); //Prints 10
return …Run Code Online (Sandbox Code Playgroud) 我想实现我自己的简单矢量类.T即使保留的内存耗尽,此向量也应支持推送新元素(类型).所以,我需要分配一个新的内存块,复制元素,然后释放旧的内存块.
如果我使用new T[]然后创建一个内存块,那么我必须使用它来释放它delete[],这将使向量中的每个元素的构造函数被调用.我不希望这样,因为我想到只使用复制旧矢量memcpy().
所以我想出了一个决定是分配内存使用new char[]并使用placement new来填充数组.当我需要重新分配保留的内存时,我只是memcpy()在该内存块上使用,然后使用它来释放它delete[].
这是合理的解决方案吗?