我知道这可能已经被问过,并且我已经查看了其他答案,但我仍然无法完全理解这一点。我想了解以下两个代码之间的区别:
MyClass getClass(){
return MyClass();
}
Run Code Online (Sandbox Code Playgroud)
和
MyClass* returnClass(){
return new MyClass();
}
Run Code Online (Sandbox Code Playgroud)
现在假设我在 main 中调用这些函数:
MyClass what = getClass();
MyClass* who = returnClass();
Run Code Online (Sandbox Code Playgroud)
如果我明白这一点,在第一种情况下,在函数作用域中创建的对象将具有自动存储,即当您退出函数作用域时,其内存块将被释放。另外,在释放此类内存之前,返回的对象将被复制到我创建的“what”变量中。因此该对象将只存在一份副本。我对么?
1a. 如果我是对的,为什么需要 RVO(返回值优化)?
在第二种情况下,对象将通过动态存储进行分配,即即使在函数范围之外它也会存在。所以我需要delete在上面使用 a 。该函数返回指向该对象的指针,因此这次没有进行复制,并且执行 delete who 将释放先前分配的内存。我(希望)是正确的吗?
我也明白我可以做这样的事情:
MyClass& getClass(){
return MyClass();
}
Run Code Online (Sandbox Code Playgroud)
然后在主要部分:
MyClass who = getClass();
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我只是告诉“谁”与函数中创建的对象是同一个对象。不过,现在我们已经超出了函数范围,因此该对象不一定再存在。所以我觉得应该避免这种情况,以免造成麻烦,对吧?(这同样适用于
MyClass* who = &getClass();
Run Code Online (Sandbox Code Playgroud)
这将创建一个指向局部变量的指针)。
额外问题:我认为到目前为止所说的一切在返回时也是正确的vector<T>(例如,vector<double>),尽管我错过了一些片段。我知道向量是在堆栈中分配的,而它包含的内容在堆中,但使用vector<T>::clear()足以清除此类内存。现在我想遵循第一个过程(即按值返回向量):当复制向量时,它包含的对象也将被复制;但退出函数作用域会破坏第一个对象。现在我拥有的原始对象不包含在任何地方,因为它们的向量已被破坏,并且我无法删除仍在堆中的此类对象。或者也许 aclear()是自动执行的?
我知道我可能会纠正这些主题(特别是矢量部分)的一些误解,所以我希望你能帮我澄清它们。
具有以下功能:
virtual HRESULT GetMediaType(
int iPosition,
CMediaType *pMediaType
);
Run Code Online (Sandbox Code Playgroud)
如何调用它以便通过引用传递pMediaType并保留对方法中对象所做的所有操作?
对于 Leetcode 问题 1312,我实现了按值传递解决方案,我的测试用例执行时间超过 120 毫秒,对于相同的测试用例,执行时间大幅减少到大约 8 毫秒,如何?以下是两种解决方案:
120ms + 解决方案/不接受:
class Solution {
public:
vector< vector<int> > dp;
int insert(string s,int l,int r)
{
if(dp[l][r]!=-1)
return dp[l][r];
else if(l>=r)
return 0;
if(s[l]==s[r])
dp[l][r] = insert(s,l+1,r-1) ;
else
dp[l][r] = 1 + min( insert(s,l+1,r), insert(s,l,r-1) ) ;
return dp[l][r];
}
int minInsertions(string s) {
dp.resize(s.length()+1, vector<int> (s.length()+1,-1) );
return insert(s,0,s.length()-1);
}
};
Run Code Online (Sandbox Code Playgroud)
~8ms 解决方案:
class Solution {
public:
vector< vector<int> > dp;
int insert(string& s,int l,int r)
{
if(dp[l][r]!=-1)
return …Run Code Online (Sandbox Code Playgroud) 我有两个问题:
我是对的,在4位系统上,指针是4个字节吗?
是"通过引用传递"和"通过指针传递相同的东西,只是不同的措辞?
我是Perl的新手,我无法弄清楚这一点.我有两组看似相同的代码,但是一个子程序更新了值而另一个没有.在第一组代码中,我的理解是传递对数组的引用,然后更新该引用指向的值.然后在离开子例程时,值已更改.但是,在第二个中,我希望发生同样的事情.它会更新数组,但在离开子程序后会忘记它.有人可以用第二套代码向我解释幕后发生的事情吗?
第一套代码:
#!/usr/bin/perl -w
use strict;
{
my @array = (1, 2, 3);
removeSecondElement(\@array);
print @array; #output: 13
print("\n");
}
sub removeSecondElement{
my ($arrayReference) = @_;
splice(@$arrayReference, 1, 1);
print @$arrayReference; #output: 13
print "\n";
}
Run Code Online (Sandbox Code Playgroud)
第二代码集:
#!/usr/bin/perl -w
use strict;
{
my @array = (1, 2, 3);
removeSecondElement(\@array);
print @array; #output: 123
print("\n");
}
sub removeSecondElement{
my ($arrayReference) = @_;
my @array = @$arrayReference;
splice(@array, 1, 1);
print @array; #output: 13
print "\n";
}
Run Code Online (Sandbox Code Playgroud) perl pass-by-reference pass-by-value subroutine pass-by-pointer