标签: pass-by-pointer

返回一个对象:值、指针和引用

我知道这可能已经被问过,并且我已经查看了其他答案,但我仍然无法完全理解这一点。我想了解以下两个代码之间的区别:

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)
  1. 如果我明白这一点,在第一种情况下,在函数作用域中创建的对象将具有自动存储,即当您退出函数作用域时,其内存块将被释放。另外,在释放此类内存之前,返回的对象将被复制到我创建的“what”变量中。因此该对象将只存在一份副本。我对么?

    1a. 如果我是对的,为什么需要 RVO(返回值优化)?

  2. 在第二种情况下,对象将通过动态存储进行分配,即即使在函数范围之外它也会存在。所以我需要delete在上面使用 a 。该函数返回指向该对象的指针,因此这次没有进行复制,并且执行 delete who 将释放先前分配的内存。我(希望)是正确的吗?

  3. 我也明白我可以做这样的事情:

    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()是自动执行的?

我知道我可能会纠正这些主题(特别是矢量部分)的一些误解,所以我希望你能帮我澄清它们。

c++ vector pass-by-reference pass-by-value pass-by-pointer

2
推荐指数
1
解决办法
2093
查看次数

按值传递指针

具有以下功能:

virtual HRESULT GetMediaType(
  int iPosition,
  CMediaType *pMediaType
);
Run Code Online (Sandbox Code Playgroud)

如何调用它以便通过引用传递pMediaType并保留对方法中对象所做的所有操作?

c++ pass-by-reference pass-by-pointer

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

C++ 中的执行时间差异(通过引用传递和通过值传递的函数之间)是否显着?

对于 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)

c++ pass-by-reference pass-by-pointer c++14 c++17

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

指针大小和Pass-by-Reference与Pass-by-P​​ointer

我有两个问题:

  1. 我是对的,在4位系统上,指针是4个字节吗?

  2. 是"通过引用传递"和"通过指针传递相同的东西,只是不同的措辞?

c c++ sizeof pass-by-reference pass-by-pointer

0
推荐指数
1
解决办法
749
查看次数

为什么这些代码块的行为有所不同?

我是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

0
推荐指数
1
解决办法
56
查看次数