我在C++中看到有多种方式来分配和释放数据,我知道当你打电话给malloc你时应该打电话free,当你使用new操作员时你应该配对,delete将两者混合是错误的(例如,调用free()创建的东西)与new操作员),但我不知道何时应该使用malloc/ free何时应该在我的真实世界程序中使用new/ delete.
如果您是C++专家,请告诉我您在此方面遵循的任何经验法则或惯例.
可能重复:
我何时应该在C++中使用new关键字?
我什么时候应该在C++中使用"new"运算符?我来自C#/ Java背景,实例化对象让我感到困惑.
如果我创建了一个名为"Point"的简单类,当我创建一个点时,我应该:
Point p1 = Point(0,0);
Run Code Online (Sandbox Code Playgroud)
要么
Point* p1 = new Point(0, 0);
Run Code Online (Sandbox Code Playgroud)
有人可以为我澄清何时使用新操作员以及何时不使用?
重复:
有关:
可能重复:
为什么你想要在堆而不是堆栈上分配内存?
Test2 *t2 = new Test2();
t2->test();
Test2 t3;
t3.test();
Run Code Online (Sandbox Code Playgroud)
为什么我要创建Test2类型的指针对象?为什么不做Test2的非指针版本?我为什么要做指针对象?
在这里找到答案:
#include <iostream>
struct person_t{
int age;
};
person_t get_person1(){
person_t person;
person.age = 10;
return person;
}
person_t * get_person2(){
person_t *person = new person_t;
person->age = 20;
return person;
}
int main(){
person_t person1 = get_person1();
person_t *person2 = get_person2();
std::cout << person1.age << std::endl;
std::cout << person2->age << std::endl;
delete person2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道从函数返回结构的最安全的方法是什么.
正如在这里和这里的问题的答案中所说,当你创建一个对象时get_person1(),该对象将在它超出范围之后被销毁.
但是当我搜索"如何从函数c ++返回一个结构"时,它建议我使用方法一(带有get_person1())(这里的例子).但我认为该方法会在调用函数后销毁对象,我认为方法2是最安全的.
我错了吗?或者关于这个话题的任何意见..?
谢谢!!
我刚刚在C++上重读了一些代码(我现在正在学校学习Java),而且当我必须使用删除时,我有点困惑.
例如:声明两个对象时:
Fraction* f1;
Fraction* f2;
Run Code Online (Sandbox Code Playgroud)
并像这样创建f1和f2:
f1 = new Fraction(user_input1, user_input2);
f2 = new Fraction(user_input3, user_input4);
Run Code Online (Sandbox Code Playgroud)
下次我想使用newoperator创建一个新对象时,是否必须先删除?我很困惑,因为我习惯在java中使用垃圾收集器来处理对象及其删除.在重新使用新内容之前是否必须删除?
if (f1) delete f1;
if (f2) delete f2;
//initialize again...
Run Code Online (Sandbox Code Playgroud) 来自C#世界,我正在努力确保我不会在我被分配到的C++项目中引入内存泄漏和错误.我正在编写使用结构来解析来自数据缓冲区的信息的代码.由于缓冲区中出现的数据结构数量可能会在运行时发生变化,因此stl向量用于存储已处理的数据.我在现有软件中遇到了以下代码块,并且很难理解它的工作原理:
MyVectorOfObjects.clear();
for (unsigned __int8 i = 0; i < NumberOfObjects; i++)
{
MyParserObject parserObject; // Declaring without 'new'?
parserObject.Decode(buffer, offset, size); // A method on the struct.
MyVectorOfObjects.push_back(parserObject); // Does this keep parserObject in scope?
}
Run Code Online (Sandbox Code Playgroud)
我的问题具体是:
根据这个问题,parserObject由于new没有使用关键字,每次迭代都不会超出范围?显然这段代码一直在运行.
在这种情况下,是否将对象置于vector保持parserObject范围内?
根据这个问题,解析了parserObject.如果是这种情况,那么性能影响(例如内存消耗,内存分配等)是什么?此外,复制的parserObjects是否假设与向量相同的范围?
谢谢你的帮助.
对反向排序容器的推荐方法(例如:按降序排序向量)似乎是:
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
我理解第三个参数是一个函数或函数,它帮助sort()进行比较,而std :: greater是一个模板函子,但我不明白这里发生了什么.我的C++非常生疏,如果这些都是愚蠢的问题,请耐心等待:为什么那之后std::greater<int>有括号?我们std::greater在这里创建一个新对象吗?在这种情况下,为什么我们不需要new这里的关键字?
似乎我可以在没有使用这个词的情况下编程new,我也不必担心删除任何东西,所以我为什么要调用它?
根据我的理解,这是因为我会耗尽堆栈内存.
它是否正确?我想我的主要问题是,我该new什么时候打电话?
我正在尝试使用mysql connexion从我的数据库中获取std :: string
这是简单的代码:
sql::Statement *stmt = con->createStatement();
sql::ResultSet *res = stmt->executeQuery("SELECT * FROM test.new_table");
while (res->next()) {
std::string somestring = res->getString("idnew_table");
} //crashes here
delete res;
delete stmt;
Run Code Online (Sandbox Code Playgroud)
所以,executeQuery很好,我进入循环,如果我中断,预期的结果是在一些字符串.在somestring声明之后,我继续前进到循环结束,并在下一次迭代之前崩溃!
这是调用堆栈:
> msvcp100d.dll!std::_Lockit::_Lockit(int kind) Line 64 + 0x14 bytes C++
msvcp100d.dll!std::_Container_base12::_Orphan_all() Line 200 C++
CM.dll!std::_String_val<char,std::allocator<char> >::~_String_val<char,std::allocator<char> >() Line 478 + 0xb bytes C++
CM.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::~basic_string<char,std::char_traits<char>,std::allocator<char> >() Line 755 + 0xf bytes C++
CM.dll!DAL::GetInfo() Line 45 + 0xc bytes C++
Run Code Online (Sandbox Code Playgroud)
输出:
First-chance exception at 0x1038ad4a (msvcp100d.dll) in CMLauncher.exe: 0xC0000005: Access …Run Code Online (Sandbox Code Playgroud)