小编Sak*_*ham的帖子

如何在矢量被破坏时解除分配内容?

据我所知,对于两个向量声明:

//TYPE 1
std::vector<cls> vec;     //cls is user defined datatype(A class)
Run Code Online (Sandbox Code Playgroud)

向量的内存在堆栈上分配,向量中的内容的内存在堆上分配.

以下声明也是如此(如果我错了,请纠正我):

//TYPE 2
std::vector<cls*> vec;    //cls is user defined datatype(A class)
Run Code Online (Sandbox Code Playgroud)

现在,当Type 1中的向量超出范围时,将为存储在其中的对象释放内存.

但是如果我插入如下的元素(假设我有正确的重载构造函数)然后向量超出范围,那么在类型2中会发生什么:

vec.push_back(new cls(5));
Run Code Online (Sandbox Code Playgroud)

我明确地尝试调用clear但是没有调用析构函数.是否会自动释放内存并调用析构函数.如果不是那么如何实现.

此外,如果我将vector声明为vector,那么为向量分配的内存以及内容:

std::vector<cls*> *vec = new std::vector<cls*>;
Run Code Online (Sandbox Code Playgroud)

c++ stl

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

C++:获取传递给函数的多维数组的行大小

我正在尝试编写一个打印出多维数组内容的函数.我知道列的大小,但不知道行的大​​小.

编辑:因为我没有说清楚,传递给这个函数的数组不是动态分配的.这些大小在编译时是已知的.

我正在使用3x2阵列进行测试.这是现有的功能:

void printArrays(int array1[][2], int array2[][2]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 2; j++) {
            cout << "\narray1[" << i << "][" << j << "] = "
                 << setfill('0') << setw(2) << array1[i][j]
                 << "\tarray2[" << i << "][" << j << "] = "
                 << setfill('0') << setw(2) << array2[i][j];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,这只有在我知道"i"的大小为3(在这种情况下)时才有效.然而,理想情况下,无论第一维的大小如何,我都希望该函数能够工作.

我以为我可以使用sizeof()函数来做到这一点,例如

int size = sizeof(array1);
Run Code Online (Sandbox Code Playgroud)

......从那里做一些数学.

这是奇怪的部分.如果我在数组中使用sizeof()函数,它返回值4.我可以使用指针表示法取消引用数组:

int size = …
Run Code Online (Sandbox Code Playgroud)

c++ sizeof multidimensional-array

7
推荐指数
1
解决办法
3万
查看次数

删除新位置

我知道对使用placement new创建的变量调用delete然后访问该内存块具有未定义的行为.

int* x = new int[2];
char* ch = new(x) char();
*ch = 't';
delete ch;
Run Code Online (Sandbox Code Playgroud)

但是如果在堆栈上分配内存块而不是堆,然后我们在该变量上调用delete然后访问内存,则会得到块类型无效的异常.

int x[2];
char* ch = new(x) char();
*ch = 't';
delete ch;
Run Code Online (Sandbox Code Playgroud)

所以问题清单是:

  • 是否由于堆栈上的删除调用而导致异常?
  • 在堆栈上的内存块上使用new new是没关系的吗?
  • 如果是,那么我该如何删除字符指针.
  • 是否可以使用placement new在单个内存块上分配多个变量?

c++

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

AngularJS中的滚动事件

我有一个带有滚动条的div.现在我希望得到一个事件,每次触发,用户滚动.

这是可能的AngularJS,还是我必须使用jQuery?

编辑: 到目前为止我想出了以下内容:

// JS
.directive('scroll', function() {
    return function(scope, element, attrs){

        angular.element(element).bind("scroll", function(){
            console.log(1);
        });
    };
});

// HTML
<div class="wrapper" style="height: 1550px" scroll>
[...]
</div>
Run Code Online (Sandbox Code Playgroud)

但这不起作用(我在Firebug-Console中看不到任何日志).

javascript angularjs

7
推荐指数
2
解决办法
2万
查看次数

r - 使用summarise_each()来计算忽略NA的记录

有没有办法用来summarise_each()计算数据框中的记录数,但忽略NAs?

示例/样本数据

df_sample <- structure(list(var_1 = c(NA, NA, NA, NA, 1, NA), var_2 = c(NA, 
  NA, NA, NA, 2, 1), var_3 = c(NA, NA, NA, NA, 3, 2), var_4 = c(NA_real_, 
  NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), var_5 = c(NA, 
  NA, NA, NA, 4, 3)), .Names = c("var_1", "var_2", "var_3", "var_4", 
  "var_5"), row.names = 5:10, class = "data.frame")

> df_samp
   var_1 var_2 var_3 var_4 var_5
5     NA    NA    NA    NA    NA
6     NA    NA    NA    NA    NA …
Run Code Online (Sandbox Code Playgroud)

r dplyr

7
推荐指数
2
解决办法
6921
查看次数

Angular Input() 提供默认值后未定义

下面是与 3 个变量一起使用的输入装饰器,并为每个变量分配了默认值

  @Input() score: number = 0;
  @Input() text: string = 'test';
  @Input() color: string = 'red';
Run Code Online (Sandbox Code Playgroud)

这就是我将值传递给 ngFor 内的组件的方式。

  [text]="item.name"
  [score]="item.score"
  [color]="item.color"
Run Code Online (Sandbox Code Playgroud)

如果我的 item 对象不包含color 属性,则组件中的颜色变量应采用“红色”作为默认值。

但是当我将其记录为:

ngOnInit() {
    console.log(this.score, this.text, this.color);
  }
Run Code Online (Sandbox Code Playgroud)

然后颜色变量将undefined作为值。

这是上述日志的控制台

8 "English" undefined
6 "Spanish" "blue"
Run Code Online (Sandbox Code Playgroud)

第一个日志是当项目包含颜色属性时,第二个是当它包含值为蓝色的属性颜色

javascript angular angular-input

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

析构函数是否会自动为成员变量释放堆内存?

我对析构函数有一些疑问.

class cls
{
    char *ch;
public:
    cls(const char* _ch)
    {
        cout<<"\nconstructor called";
        ch = new char[strlen(_ch)];
        strcpy(ch,_ch);
    }
    ~cls()
    {
        //will this destructor automatically delete char array ch on heap?
            //delete[] ch; including this is throwing heap corruption error
    }
    void operator delete(void* ptr)
    {
        cout<<"\noperator delete called";
        free(ptr);
    }
};
int main()
{
    cls* cs = new cls("hello!");
    delete(cs);
    getchar();
}
Run Code Online (Sandbox Code Playgroud)

另外,由于析构函数会在删除时自动调用,为什么在所有逻辑都可以在析构函数中编写时我们需要显式删除?

我对操作员删除和析构函数非常困惑,无法确定其具体用法.精心描述将非常有用.

编辑: 我基于答案的理解:对于这种特殊情况,默认的析构函数会破坏char指针,所以我们需要先显式删除char数组,否则会导致内存泄漏.如果我错了,请纠正我.

c++

6
推荐指数
2
解决办法
9523
查看次数

为什么命名构造函数是静态的

我正在阅读有关命名构造函数的帖子.它声明了命名构造函数是静态的.可能是什么原因.非静态方法不会起到同样的作用吗?

c++

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

为什么构造函数被调用两次

我不明白怎么回事constructors work

在这里我宣布了一个对象obj2.它调用构造函数abc(),这非常好.

但是当我分配时

obj2 =  100 
Run Code Online (Sandbox Code Playgroud)

为什么编译器允许将整数初始化为类对象?如果它完全允许它如何破坏对象,然后它是如何调用另一个参数化构造函数.

现在我有另一个问题,为什么destructor只有一次因为有two对象而被调用?

还有一个疑问,我已经是,编译器是not doing anythingdefault constructor那为什么默认的构造函数是required

class abc{
public:
    int a, b;

    abc()
    {a = 0; b = 0;}

    abc(int x)
    {a = x;}

    ~abc()
    {std::cout << "Destructor Called\n";}
};
int main()
{
    abc obj1;
    cout << "OBJ1 " << obj1.a << "..." << obj1.b << "\n";
    abc obj2;
    cout << "OBJ2 " << obj2.a << "..." …
Run Code Online (Sandbox Code Playgroud)

c++

6
推荐指数
3
解决办法
2716
查看次数

int转换 - 给我奇怪的数字

我是编程世界的新手,C++已经失去了我.我的程序中有这些行

pennies=(amount-nickels*.05)/.01;
Run Code Online (Sandbox Code Playgroud)

金额是a double,而int.

该程序返回时,正确的价值便士是一个double,但事情是有点过(关1的大部分时间)每当便士int.

为什么会这样?

c++

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