c++内存分配方法
c++ memory allocation howto
我刚刚开始C++,我不明白我的代码是如何工作的:
好的,我分配内存,但在分配时没有人知道要分配的内存的大小。但代码仍然有效。分配了多少内存?编译器如何知道我需要多少内存?
编辑:
如果我的问题不清楚,我很抱歉。让我试着澄清一下。所以我使用指针在堆中动态分配一些内存。但由于sting变量中没有文本,在我看来,很难知道我将通过getline输入多少文本(字节)。
我试着问两个不同文本的大小,是的,它们的大小不同。
sizeof("") // is 1 (because of the ending 0 maybe?)
sizeof("sometext") // is 9
但对于字符串:sizeof两次都给了我4。很明显,sizeof()给出了指向字符串的指针的长度。
如何分配内存?如果我为一个新字符串分配内存,只分配给指向字符串中第一个字符的内存地址的指针?显然,我输入的字符必须存储在某个地方。我首先分配内存,然后将一些文本加载到内存中
编辑2:使编辑后的代码看起来像代码,而不是纯文本。
//Edit:
string a,b = "sometext";
cout << sizeof(a) << endl; //4
cout << sizeof(b); //4
//--------------------------------------------------------
#include <iostream>
#include <string>
#include <exception>
using namespace std;
int main()
{
//Defining struct
struct musicCD
{
string artist, title; // artist of the CD
};
//Memory allocation
musicCD *ptr;
try{ptr = new musicCD;}
catch(bad_alloc){cerr << "Out of memory :(";return -1;}
catch(...){cerr << "Something bad happened :O !";return -1;
}
//Get the data to store:
cout << "Please enter the data for the CD!' " << endl;
cout << "Please enter the artist: ";getline(cin, ptr->artist); cout << endl;
//Write out the data
cout << "The data entered: " << endl;
cout << "The artist performing is: t" << ptr->artist << endl;
delete ptr;
return 0;
}
您似乎对std::string
或任何动态容器如何处理其内存需求不是预先确定的这一事实感到困惑。例如,std::string
不在内部存储其字符数据。简单地说,它包含一个指针,指向另一个动态分配的缓冲区,该缓冲区包含实际数据。std::string
具有构造函数、析构函数和赋值运算符,它们自动管理包含实际字符数据的额外缓冲区。这包括重新分配、复制数据、更新内部指针以及在需要额外存储时释放以前的缓冲区。包含实际数据的缓冲区的大小不计入std::string
的大小,只有指向它的指针计入。在std::string
的整个生命周期中,它的每个实例都只直接包含一定数量的成员,这些成员的大小都是恒定的。在c++中,所有类型都有一个编译时常量大小。
有关string
的简化实现,请参阅规则五,以了解其工作原理。来自该示例的类rule_of_five
的大小仅仅是char*
的大小,而与该指针所指向的缓冲区的内容无关。实际的缓冲区稍后在构造期间或之后分配,也就是在对象本身的初始分配已经完成之后。
编辑:在某些情况下,当处理非常短的字符串时,字符串可以在内部存储其字符数据。这是在其他容器中通常看不到的优化。看看这个答案。
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- GlobalAlloc而不是其他分配方法
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 使 std::vector 分配对齐内存的现代方法
- 使用同一类中的方法重新分配字段时出现问题
- 工厂方法:分配和strcpy_s的差异
- 在类中分配具有方法值的变量
- 删除类成员的动态分配内存的最佳方法是什么
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- const_cast const 方法中的"this"将"this"分配给外部变量?
- 使用类中的方法作为运算符将值分配给类的私有成员
- 释放分配给大量矢量的内存的最有效方法是什么?
- COM / DCOM:服务器存根不会为现有接口中的新方法分配内存
- 如何将 ifstream&return from 方法分配给变量?
- 这感觉有点反模式,有没有更好的方法(C++ - 分配给引用)
- 如何在Java端释放本机方法分配的内存
- 跟踪GPU内存泄漏的专业方法(分配而不释放)
- free()方法分配的内存安全吗?