草庐IT

c++ - 如何处理在 C/C++ 中返回的指向动态内存的指针

我想知道在C和C++中使用指向动态内存的指针处理内存泄漏的协议(protocol)。例如,strtok返回一个char*。据推测,返回的指针最终必须被释放/删除。我注意到referencepage甚至没有提到这一点。那是因为这只是假设吗?另外,你怎么知道是删除还是释放?是否需要研究找出每个函数最初使用的是什么语言,然后假设所有C程序都使用malloc/free而C++使用new/delete? 最佳答案 strtok不会返回指向新分配内存的指针,而是返回指向先前分配的内存位置的指针。让我们假设:charString[1024];st

c++ - 返回一个对象和作用域

我正在处理一个fraction类作为CS作业,并编写了以下代码:fractionfraction::add(fractionother){fractiontemp;/*manipulatetemp*/returntemp;}这非常有效,创建了一个新的fraction对象,然后将其返回给调用代码。问题是,为什么这行得通?当add方法返回时,我的分数temp应该超出范围并因此被销毁,但它被传回调用代码而没有出现任何错误。为什么返回局部作用域的东西会导致它在超出作用域后继续存在? 最佳答案 您返回的是temp的值,而不是temp对象本身。

c++ - 我可以在 C++ 中将类作为对象处理吗

这是我想要实现的目标:我有一个从主类继承的类(Class1到Classn)列表我希望能够实例化任何n个类的对象,而不必做一个大的switchcase(或等效的)。类似的东西:staticClassPointerTypeconst*constArrayOfClassTypes[]={Class1,Class2,..Classn};staticClass*GetObjectOfClass(inti){returnnewArrayOfClassTypes[i](someparametersfortheconstructor);}您可以在其他OO语言(如Delphi)中执行此操作,其中您具有T

c++ - 如何将类中的函数作为参数传递给 C++11 中同一类中的另一个函数?

以下极简代码用于说明我的问题。这些代码不编译。如何使用lambda表达式或std::bind将函数成员作为参数传递?非常感谢您的帮助#includeusingnamespacestd;classABC{private:intx=3;intadd2num(inta,intb){returna+b+x;}intworker(int&fun(inta,intb),inta,intb){returnfun(a,b);}public:intdoSomething(inta,intb){returnworker(add2num,a,b);}};intmain(){ABCtest;cout

c++ - 什么时候适合使用 std::optional

我想知道这是否会被视为std::optional的有效用法。我有一个返回process_id(std::uint32_t值)的函数,使用标准的“std::uint32_t会更有效吗>"如果我​​们找不到目标进程ID或返回std::optional更合适则返回0的函数?例子:std::optionalFindProcessID(std::string_viewprocess){boolfind=false;if(!find)//wefailtofindtheprocess_idandreturnnothing.returnstd::nullopt;elseif(find)return10

c++ - 如何在 C++ 中返回数据的拷贝

我正在尝试在C++模板类中返回数据的新拷贝。以下代码出现此错误:从“int”到“int*”的无效转换。如果我删除newT,那么我不会返回数据的拷贝,而是返回指向它的指针。templateTOrderedList::get(intk){Node*n=list;for(inti=0;iget_link();}returnnewT(n->get_data());//Thislineisgettingtheerror**********} 最佳答案 new创建并返回一个指针。您只需要一个将被隐式创建的拷贝,因为return语句将调用对象T的

c++ - 返回对临时的引用

我知道返回对临时对象的引用是非法的,但这是我的问题:conststringSet&Target::dirList(constdirTypetype)const{switch(type){caseSOURCE_DIR:returnm_sourceDirs;caseHEADER_DIR:returnm_headerDirs;caseRESOURCE_DIR:returnm_resourceDirs;default:returnstringSet();//PROBLEMHERE!}}前三个选项返回对stringSet数据成员的const引用。defaultcase应该怎么办?如果我将它排除在

c++ - 使用 g++、bison 和 flex 进行编译时,yyparse() 中未定义对 `yylex' 的引用

我在编译代码时遇到问题(未定义对“yylex”的引用)。让我们从代码片段开始,我将在下面描述详细信息:弹性:%{#includeexternintyylex();%}%%"="{returnEQ;}"!="{returnNE;}""{returnGT;}":="{returnASSIGN;}";"{returnSEMICOLON;}"IF"{returnIF;}"THEN"{returnTHEN;}"END"{returnEND;}[_a-z]+{yylval.text=strdup(yytext);returnIDENTIFIER;}[\t]+[0-9]+{yylval.var=at

c++ - 顺序新建和删除

继续我的previousquestion,我想请教以下问题:给定一个C++函数,其中有一个new语句但没有显式返回任何内容(即使用return语句),它是否也应该始终有一个delete?如果不是,能否请您举个例子。 最佳答案 它不必显式返回新创建的对象,但它应该以某种方式将其传递给其他对象。可能的场景包括:在成员函数中,创建一个对象并将其分配给包含对象的字段。例子:classFoo{private:Baz*baz;public:Foo():baz(0){}voidcreate_bar(){baz=newBaz();}~Foo(){d

c++ - 按值返回时强制 RVO/移动构造

假设我有一个带有复制构造函数和移动构造函数的对象“foo”,以及一个函数foof(){foobar;/*dosomework*/returnbar;}该标准似乎声明编译器将尝试执行以下操作:NRVO,按右值引用返回,按值返回,失败;按照这个顺序。有什么方法可以强制编译器永远不按值返回,因为我的复制构造函数非常昂贵吗? 最佳答案 thecompilerwilltrytodo:NRVO,returnbyr-valueref,returnbyvalue,fail;inthatorder.上面的措辞不准确,可能表明您有误解。编译器可以使用N