小编zhe*_*oli的帖子

如果我删除一个类,它的成员变量是否会自动删除?

我一直在研究,没有任何相关的问题,所以我来到这里.

我试图避免内存泄漏,所以我想知道:

假设我有一个MyClass成员ints ab一个类int array c,它们填充了一个成员函数:

class MyClass
{
    public:
        int a, b;
        int c[2];
        void setVariables() 
        {
            a, b = 0;
            for (int i = 0; i < 2; i++) 
            {
                c[i] = 3;
            }
        }
};
int main(int argc, char* argv[])
{
    MyClass* mc = new MyClass();
    mc->setVariables();
    delete mc;
} 
Run Code Online (Sandbox Code Playgroud)

现在,我打电话后delete mc,会a,b以及所有的内容c被删除?或者我必须在析构函数中明确地做到这一点MyClass

c++ variables class member delete-operator

25
推荐指数
5
解决办法
3万
查看次数

Nginx:当`index`和`try_files`在同一个块中时,为什么要处理`try_files`,而不是`index`指令?

nginx.conf如下:

http {
    server {
        listen  8080;
        server_name example.com;             
        root /tmp/test/example;
        location / {
            index index.html;
            try_files $uri /test.html;
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

当我访问时example.com:8080,它访问/tmp/test/example/test.html,而不是index.html.

nginx

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

使用参数(const T&,const T&)或(const char(&)[N],const char(&)[M])重载模板的模糊调用

对于以下代码:

#include <iostream>
using std::cout; using std::endl;

template <typename T>
int compare(const T&, const T&) {
    cout << __PRETTY_FUNCTION__ << endl;
    return 0;
}
template <size_t N, size_t M>
int compare(const char (&)[N], const char (&)[M]) {
    cout << __PRETTY_FUNCTION__ << endl;
    return 0;
}

int main(int argc, char *argv[]) {
    compare("hi", "is");
}
Run Code Online (Sandbox Code Playgroud)

当我编译代码时g++ -std=c++1y,它会抱怨:

error: call of overloaded ‘compare(const char [3], const char [3])’ is ambiguous
     compare("hi", "is");
Run Code Online (Sandbox Code Playgroud)

根据模板重载的规则,可行的功能是:

compare(const T&, const T&) with T = …
Run Code Online (Sandbox Code Playgroud)

c++ templates overloading c++11

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

Javascript the Definitive Guide:将对象转换为字符串的步骤混淆

根据Javascript the Definitive Guide第6版中的3.8.3节:

要将对象转换为字符串,JavaScript将执行以下步骤:
•如果对象具有toString()方法,则JavaScript会调用它.如果它返回原始值,JavaScript会将该值转换为字符串(如果它不是字符串)并返回该转换的结果.请注意,表3-2中的原始到字符串转换都已明确定义.

•如果对象没有toString()方法,或者该方法没有返回原始值,则JavaScript会查找valueOf()方法.如果方法存在,JavaScript会调用它.如果返回值是基元,则JavaScript会将该值转换为字符串(如果尚未存在)并返回转换后的值.

•否则,JavaScript不能获得,无论是从原始值toString()valueOf(),所以它抛出一个TypeError.

例如:

var obj = {
    toString: function() {
        console.log('toStirng...');
        return 90;
    },
    valueOf: function() {
        console.log('valueOf...');
        return 80;
    }
}

console.log(obj + '');
Run Code Online (Sandbox Code Playgroud)

因此,上面的代码片段会obj因为而转换为字符串obj + '',所以它应该打印:

toString...
90
Run Code Online (Sandbox Code Playgroud)

但实际上,它打印:

valueOf...
80
Run Code Online (Sandbox Code Playgroud)

那有什么不对?不obj + ''转换obj为字符串?

javascript tostring

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

从管道命令附加到数组变量

我正在编写一个bash函数来获取所有git存储库,但是当我想将所有git存储库路径名存储到数组时,我遇到了一个问题patharray.这是代码:

gitrepo() {
    local opt

    declare -a patharray
    locate -b '\.git' | \
        while read pathname
        do
            pathname="$(dirname ${pathname})"
            if [[ "${pathname}" != *.* ]]; then
            # Note: how to add an element to an existing Bash Array
                patharray=("${patharray[@]}" '\n' "${pathname}")
                # echo -e ${patharray[@]}
            fi
        done
    echo -e ${patharray[@]}
}
Run Code Online (Sandbox Code Playgroud)

我想将所有存储库路径保存到patharray数组中,但是我无法将pipeline其包含在包含locatewhile命令的范围之外.
但是我可以在pipeline命令中获取数组,# echo -e ${patharray[@]}如果取消注释,注释命令运行良好,那么我该如何解决问题呢?

我已经尝试过该export命令,但似乎无法将其传递patharray给管道.

arrays bash pipeline

5
推荐指数
2
解决办法
993
查看次数

为什么 Bash 不能忽略 tab 补全变量名的大小写?

当我想输入命令时echo $bash_,然后按Tab键,自动补全不会发生。
但是当我输入命令echo $BASH_,然后按 时Tab,完成列表将输出如下:

$BASH_ALIASES                $BASH_COMMAND                $BASH_SOURCE
$BASH_ARGC                   $BASH_COMPLETION_COMPAT_DIR  $BASH_SUBSHELL
$BASH_ARGV                   $BASH_LINENO                 $BASH_VERSINFO
$BASH_CMDS                   $BASH_REMATCH                $BASH_VERSION
Run Code Online (Sandbox Code Playgroud)

我的.inputrc文件包含readlineignorecase选项,set completion-ignore-case on并且文件名完成不区分大小写是可以的。
所以,我希望variable name制表符补全可以忽略变量大小写。

bash readline tab-completion

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

Makefile:为什么命令替换不能在$(shell)函数中起作用?

我有一个变量Makefile:

JAVABIN = $(shell dirname $(which java))
Run Code Online (Sandbox Code Playgroud)

当我回显JAVA_HOME变量时Makefile,变量定义抱怨:

dirname: missing operand
Try 'dirname --help' for more information.
Run Code Online (Sandbox Code Playgroud)

当我引用时$(which java),JAVABIN.,所以结果是错误的.我不明白make如何读取Makefile,也许是原因.非常感谢你.

makefile

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

为什么不能在C++中重新定义类中的类型名称?

根据C++ Primer一节,7.4.1类型名称是特殊的:

通常,内部作用域可以从外部作用域重新定义名称,即使该名称已在内部作用域中使用过.但是,在类中,如果成员使用外部作用域中的名称并且该名称是类型,则该类可能不会随后重新定义该名称.

因此,例如:

typedef double Money;
class Account {
    public:
        Money balance() { return bal; }
    private:
        typedef double Money;
        Money bal;
};

int main() {
    typedef double Money;
    Money asset;
    typedef double Money;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当你编译上面的例子时,它会抱怨:

a.cc:6:24: error: declaration of ‘typedef double Account::Money’ [-fpermissive]
         typedef double Money;
                        ^
a.cc:1:16: error: changes meaning of ‘Money’ from ‘typedef double Money’ [-fpermissive]
 typedef double Money;
Run Code Online (Sandbox Code Playgroud)

那么为什么我们不能在类中重新定义类型名称,但我们可以在内部范围内吗?


我的编译器版本是g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609.
该部分还有一个注释:

虽然重新定义类型名称是错误的,但编译器不需要诊断此错误.即使程序出错,一些编译器也会悄悄地接受这样的代码.

c++ scope class typename

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

windows cmd 如何设置解析变量名?

如果我运行set如下:

C:\Users\vagrant>SET UNDEFINED=foo

C:\Users\vagrant>SET UNDEFINED
UNDEFINED=foo

C:\Users\vagrant>SET UNDEFINED  
Environment variable UNDEFINED   not defined

C:\Users\vagrant>SET UNDEFINED | more
UNDEFINED=foo

C:\Users\vagrant>SET UNDEFINED >nul

C:\Users\vagrant>SET UNDEFINED >nul 
Environment variable UNDEFINED   not defined

C:\Users\vagrant>SET UNDEFINED  | more
Environment variable UNDEFINED   not defined

C:\Users\vagrant>SET UNDEFINED >nul | more
Environment variable UNDEFINED   not defined

C:\Users\vagrant>SET UNDEFINED >nul| more

C:\Users\vagrant>SET UNDEFINED 2>nul | more

C:\Users\vagrant>SET UNDEFINED 2>nul| more
UNDEFINED=foo
Run Code Online (Sandbox Code Playgroud)

注意,上面的第二个命令是SET UNDEFINED ,后面有两个空格。而且SET UNDEFINED >nul SET UNDEFINED >nul | moreSET UNDEFINED …

windows cmd batch-file environment-variables

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

为什么不能对象文字调用toCtring()方法如{} .toString()导致错误?

当object literal调用toString()方法时{}.toString()会导致语法错误,但是当数组文字调用toString()时就可以了.当我将对象文字分配给变量时,那么当它调用该toString()方法时就可以了.为什么?例如:

var o = {};
o.toString();  // OK

{}.toString(); 
// > Uncaught SyntaxError: Unexpected token .
[1, 2, 3].toString(); // OK
Run Code Online (Sandbox Code Playgroud)

谢谢!

javascript object-literal

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