我已经搜索过了,但我对这三个概念并不是很了解.我何时必须使用动态分配(在堆中)以及它的真正优势是什么?静态和堆栈有什么问题?我可以编写整个应用程序而无需在堆中分配变量吗?
我听说其他语言包含了"垃圾收集器",所以你不必担心内存.垃圾收集器做什么?
您可以自己操作内存,而不能使用此垃圾收集器吗?
有人告诉我这个声明:
int * asafe=new int;
Run Code Online (Sandbox Code Playgroud)
我有一个"指针指针".这是什么意思?它不同于:
asafe=new int;
Run Code Online (Sandbox Code Playgroud)
?
我已经编程了一段时间,但它主要是Java和C#.我实际上从来没有必须自己管理内存.我最近开始用C++编程,我有点困惑的是什么时候我应该把东西存放在堆栈上以及何时将它们存储在堆上.
我的理解是,非常频繁访问的变量应该存储在堆栈中,对象,很少使用的变量和大型数据结构都应该存储在堆上.这是正确的还是我错了?
这两个代码行的内存使用有什么不同吗?
int *a = malloc( 10 * sizeof(int) );
int b[10];
Run Code Online (Sandbox Code Playgroud)
第一行应为10个整数和1个指针分配内存.但我不确定第二个.那还会为10个整数和1个指针分配内存,还是只有10个整数?
我正在通过阅读教科书来学习C++."对象和指针"部分说,声明指向对象的指针,如下所示:
SomeClass *ptrMyClass;
Run Code Online (Sandbox Code Playgroud)
什么都不做.只有在定义了Class的实例之后才有意义,如下所示:
SomeClass *ptrMyClass;
ptrMyClass = new SomeClass;
Run Code Online (Sandbox Code Playgroud)
或者将这些组合在一起:
SomeClass *ptrMyClass = new SomeClass;
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么我们必须使用'new'在堆上创建SomeClass的实例?到目前为止,在本书中,指针始终指向"正常"变量(如int,float ...),这些变量不是通过使用"new"创建的.谢谢.
我正在为SLAM算法编写一个类,这是我的第一个大型C ++项目!我确实记得std::unique_ptr当我要保留一些对象时应该使用该对象,该对象应具有动态内存,一个所有者和较长的使用寿命。因此,当设计一个特定的类时,其对象仅创建一次并且应该具有全局寿命(这是保存映射的核心类对象)。所以我的想法是创建将保存该对象的std :: unique_ptr:
class Backend
{
private:
std::vector<double> values;
/// some members
public:
Backend() : values{0} {}
~Backend(){}
// some functions
};
auto backend_ptr = std::make_unique(Backend());
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:backend_ptr如果我增加私人成员的values超时工作量,会不会增加?有了您的建议,我是否甚至需要这个unique_ptr?
到目前为止,我一直在用Java编写程序.所以当我开始使用C++时,首先想到的是如何破坏/删除/完成我不再需要的对象.
使用Java我曾经将它们设置null为垃圾收集器正在处理它.但是,我不知道C++的价值.我发现这篇文章http://en.wikipedia.org/wiki/Comparison_of_Java_and_C%2B%2B解决了我的大部分问题.但仍有一些我不明白的事情.
1)在Java中有一种方法可以强制垃圾收集器在现场清理(这并不总是有用,因为它在运行之前等待一些垃圾堆叠).有没有办法用C++做到这一点?
2)(C++)与上面相反,我怎样才能使对象处于"标记为删除"的状态,程序决定何时清理它(如Java)?
3)(C++)我应该强迫垃圾收集器在现场清理(我很确定这不是正确的方式,但我要求确定)?
如果你能给出一个代码触发器的小代码示例,我会赞美它.
我刚才有一个关于c ++类成员存储的问题.
例如,我有一个这样的类:
class MyClass1{
int a;
int b[4];
int c;
}
Run Code Online (Sandbox Code Playgroud)
在主要功能:
int main(){
MyClass1 class1;
MyClass1* class_ptr1= new MyClass1();
}
Run Code Online (Sandbox Code Playgroud)
那么成员a,b,c是如何存储的?对于class1,我认为所有成员都在堆栈中分配了一个空间,甚至是数组b.
那么class_ptr1怎么样?显然它是动态分配的,也是动态分配的成员,甚至认为它们不是指针.
非常感谢.
非常感谢回复.现在我明白,一旦动态分配了类,它的所有成员也会被动态分配.在这种情况下,一旦我使用完课程,我是否需要做任何事情来解除分配?我的意思是,它只是:
delete(class_ptr1);
Run Code Online (Sandbox Code Playgroud)
或者我需要先释放其成员.
我听说过有关动态的确切含义的冲突事件,以及自动内存分配.我听说堆栈被称为自动内存分配和动态内存分配.我可以看到两者都是在程序执行之前确定堆栈内存块大小,因此它的最大大小在运行时不会增长.但是,在程序执行期间,当函数数据被推入和弹出堆栈时,堆栈会不断增长和缩小.
那么在这个意义上是不是这种动态内存分配?
如果它是不是混淆只是将堆称为动态?
有人可以帮我澄清一下吗?
编辑:在撰写本文时,我似乎混淆了一些我不知道的概念.堆栈和堆内存管理的低级concpets与C++中相同内容的高级概念之间存在差异.有关此问题的澄清,请参阅下面我接受的答案.
我正在尝试实现一个SegmentTree类以在另一个类中使用Solution。
在 中class SegmentTree,析构函数的实现如下:
~SegmentTree() {
destruct(root);
};
void destruct(Node* root) {
if (!root) return;
destruct(root->left);
destruct(root->right);
delete root;
root = NULL;
}
Run Code Online (Sandbox Code Playgroud)
那么,在 中class Solution,我们有
class Solution {
private:
SegmentTree* tree;
public:
Solution(vector<int>& nums) {
tree = new SegmentTree(nums);
}
//Question: how shall ~Solution() be implemented to free memory of the pointer tree?
};
Run Code Online (Sandbox Code Playgroud)
问题:
tree中的指针Solution?int *arr = new int(10);
int *arr = new int[10];
Run Code Online (Sandbox Code Playgroud)
是c++中动态内存分配的代码。但我不明白这两者之间有什么区别。