检查"非回收资源获取"在resharper C ++中

时间:2017-04-28 07:02:04

标签: c++ resharper

我使用VS2015和ReSharper C ++编写了一个c ++程序,我遇到了以下检查: enter image description here

有人可以解释一下为什么这次检查会跳了起来? 我认为这不是太关键,但我仍然想知道。

这里是相关的代码段:

public class Main4Activity extends AppCompatActivity {
public Button b1,po;
public TextView t1;


    public void init()
    {
        t1=(TextView)findViewById(R.id.t1);
        ViewPager viewPager = (ViewPager)findViewById(R.id.viewPager);
        ViewPagerAdapter viewPagerAdapter=new ViewPagerAdapter(this);
        viewPager.setAdapter(viewPagerAdapter);
        po=(Button)findViewById(R.id.po);
        po.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent toy=new Intent(Main4Activity.this,Main5Activity.class);
                startActivity(toy);
            }
        }) ;
        final Spinner mySpinner = (Spinner)findViewById(R.id.spinner1);
        final ArrayAdapter<String> myAdapter=new ArrayAdapter<>(Main4Activity.this,
                android.R.layout.simple_expandable_list_item_1,getResources().getStringArray(R.array.plates));
        myAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mySpinner.setAdapter(myAdapter);

mySpinner.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        if(position==0)
        {
            t1.setText("100");
        }
        else if (position==1)
        {
            t1.setText("200");
        }
        else if (position==2)
        {
            t1.setText("300");
        }
    }
});
        b1=(Button)findViewById(R.id.b1);
        b1.setOnClickListener(new View.OnClickListener() {
            @Override
           public void onClick(View v) {
               Intent intent=new Intent(Main4Activity.this,trail.class);
               startActivity(intent);
            }
      });

    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
        init();
    }


}

感谢

2 个答案:

答案 0 :(得分:4)

arr未通过引用传递足够的间接返回或声明。最终结果是当arr超出范围时,分配将丢失。

但是arr是一个指针,你说呢?确实如此,但你修改了指针本身,这需要通过引用传递指针,以便在调用函数中产生任何影响。在一天结束时,指针只是另一个变量。将其传递给函数,函数在本地副本上运行。

在这种情况下,arr是调用者传递的变量的副本。 arr和原始版本都指向同一位置,但只要您arr = new char *[rows];arr指向不同的位置,原始就不是更明智的。这就像将int(例如100)传入函数一样。最初调用者被调用者同意100,但函数中发生的事情仍然存在于函数中。

解决方案:通过引用传递。

void allocate2DArr(char** & arr, int rows, int cols)

备选方案1:返回创建的数组

char** allocate2DArr(int rows, int cols) 

备选方案2:在std::vector周围使用std::unique_ptrchar**或智能包装类来处理内存管理,并在调用时允许访问char**传统界面。

答案 1 :(得分:2)

  

有人可以解释一下为什么这次检查会跳起来?

因为您获得(已分配)资源(特别是内存),您在中没有回收(解除分配) (实际上是所有进入函数的代码路径)。

  

我认为这不是太关键,但我仍然想知道。

取决于程序的类型。内存泄漏永远不会很好,但它们在服务器和后台程序等长期运行的软件中肯定是至关重要的。

解决方案:始终delete[] new[]。更好的是:从不new[],而是使用std::vector