我使用VS2015和ReSharper C ++编写了一个c ++程序,我遇到了以下检查:
有人可以解释一下为什么这次检查会跳了起来? 我认为这不是太关键,但我仍然想知道。
这里是相关的代码段:
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();
}
}
感谢
答案 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_ptr
,char**
或智能包装类来处理内存管理,并在调用时允许访问char**
传统界面。
答案 1 :(得分:2)
有人可以解释一下为什么这次检查会跳起来?
因为您获得(已分配)资源(特别是内存),您在中没有回收(解除分配) (实际上是所有进入函数的代码路径)。
我认为这不是太关键,但我仍然想知道。
取决于程序的类型。内存泄漏永远不会很好,但它们在服务器和后台程序等长期运行的软件中肯定是至关重要的。
解决方案:始终delete[]
new[]
。更好的是:从不new[]
,而是使用std::vector
。