相关疑难解决方法(0)

1730
推荐指数
11
解决办法
54万
查看次数

在什么情况下我使用malloc vs new?

我在C++中看到有多种方式来分配和释放数据,我知道当你打电话给malloc你时应该打电话free,当你使用new操作员时你应该配对,delete将两者混合是错误的(例如,调用free()创建的东西)与new操作员),但我不知道何时应该使用malloc/ free何时应该在我的真实世界程序中使用new/ delete.

如果您是C++专家,请告诉我您在此方面遵循的任何经验法则或惯例.

c++ malloc memory-management new-operator

447
推荐指数
12
解决办法
26万
查看次数

何时使用"new"和何时不使用,在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)

有人可以为我澄清何时使用新操作员以及何时不使用?

重复:

我什么时候应该在C++中使用new关键字?

有关:

关于C++中用于自定义对象的构造函数/析构函数和new/delete运算符

在C++中适当的堆栈和堆使用?

c++ new-operator

98
推荐指数
2
解决办法
11万
查看次数


什么是安全的?从函数返回结构或指针

#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++ struct return function

11
推荐指数
1
解决办法
1085
查看次数

C++以及何时使用delete

我刚刚在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++ new-operator delete-operator

9
推荐指数
4
解决办法
8459
查看次数

在STL向量中管理范围和对象寿命

来自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)

我的问题具体是:

  1. 根据这个问题,parserObject由于new没有使用关键字,每次迭代都不会超出范围?显然这段代码一直在运行.

  2. 在这种情况下,是否将对象置于vector保持parserObject范围内?

  3. 根据这个问题,解析了parserObject.如果是这种情况,那么性能影响(例如内存消耗,内存分配等)是什么?此外,复制的parserObjects是否假设与向量相同的范围?

谢谢你的帮助.

c++ vector

8
推荐指数
1
解决办法
1785
查看次数

在C++中调用std :: sort时使用std :: greater的语法

对反向排序容器的推荐方法(例如:按降序排序向量)似乎是:

std::sort(numbers.begin(), numbers.end(), std::greater<int>());

我理解第三个参数是一个函数或函数,它帮助sort()进行比较,而std :: greater是一个模板函子,但我不明白这里发生了什么.我的C++非常生疏,如果这些都是愚蠢的问题,请耐心等待:为什么那之后std::greater<int>有括号?我们std::greater在这里创建一个新对象吗?在这种情况下,为什么我们不需要new这里的关键字?

c++ stl std

4
推荐指数
1
解决办法
216
查看次数

为什么我需要拨打新电话?

可能的重复:
在C++中何时使用"new"和何时不使用?
我什么时候应该在C++中使用new关键字?

似乎我可以在没有使用这个词的情况下编程new,我也不必担心删除任何东西,所以我为什么要调用它?

根据我的理解,这是因为我会耗尽堆栈内存.

它是否正确?我想我的主要问题是,我该new什么时候打电话?

c++ new-operator

3
推荐指数
2
解决办法
1658
查看次数

std :: string在mySQL连接器查询结果上进行迭代时崩溃

我正在尝试使用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)

c++ mysql string crash std

3
推荐指数
1
解决办法
1725
查看次数