小编Jul*_*ian的帖子

如何正确使用转换构造函数?

我读到,当提供适合转换构造函数或操作数时,C++编译器能够隐式转换类型.我实际上发现了看起来像这样的示例代码:

class Dog{
    private:
       string name;
    public:
        Dog(string n):name(n){} //This as the converting constructor
}

int main(){
    Dog d = "rover";
}
Run Code Online (Sandbox Code Playgroud)

每当我运行此代码时,编译器都会抛出一条错误消息:

从'const char [6]'转换为非标量类型'Dog'请求Dog d ="rover";

在编译时我添加了编译器选项-std=c++11,所以它不应该是关于C++版本的,对吧?
我在网上找到的例子(至少对我来说)看起来完全相同,所以我不知道这里出了什么问题.
我对此主题的输入来自此视频: 转换构造函数和重载运算符 - 最新的

c++ constructor casting type-conversion c++11

24
推荐指数
3
解决办法
2261
查看次数

Java声音 - LineUnavailableException:

我使用以下代码加载剪辑(javax.sound.sampled.Clip)

def createClip(file:String):Clip = {
    val clip = AudioSystem.getClip()
    clip.open(AudioSystem.getAudioInputStream(new File(s"sounds/$file.wav")))
    clip
}
Run Code Online (Sandbox Code Playgroud)

它是用Scala编写的,但我想任何不熟悉scala的人都会看到java基本相同,就像java一样.

我的尝试是让它毫不费力地播放这样的声音

createClip("example_WAV_File").start()
Run Code Online (Sandbox Code Playgroud)

因为我将创建一个新的 Clip,每次我调用一个声音文件,我认为关于倒回剪辑等应该没有任何问题.但是在实际应用程序(游戏)中,我使用这个库来处理声音Punch和所有这些东西的结果.现在是这样的事情,当(例如)冲压几次时,有些时候我会得到

线程"Thread-58"中的异常javax.sound.sampled.LineUnavailableException:行格式为PCM_SIGNED 44100.0 Hz,16位,立体声,4字节/帧,不支持little-endian.

我曾遇到类似的错误,但这是关于比特编码超过16位.由于我的文件有16位编码,我不知道这可能是什么...

如上所述,只有在播放几个剪辑时才会出现错误.我想,这可能表明存在内存问题.我天真地想,垃圾收集器会为我做所有工作,因为剪辑在离开其范围时会失去任何参考.

我最初的解决方案是,保持对我要播放的任何声音的引用,并且只在另一个实例需要已经播放的声音时才回放它.这个解决方案永远不会破坏,但它真的不能两次播放相同的剪辑.这就是为什么我在需要时切换到多次加载剪辑的原因.

我想,我可能应该在剪辑上使用close()方法.

val clip = createClip("example_WAV_file")
clip.start()
clip.close()
Run Code Online (Sandbox Code Playgroud)

这实际上解决了我的问题,增强了我的猜测,它可能与内存有关,但是,现在剪辑会在启动后立即停止.

我真的需要为每个剪辑创建一个线程,等待clip.getMicrosecondLength()时间关闭它吗?这听起来很糟糕.

只剩下选项 - >我使用声音API确实非常错误,即使我想,我正在使用它只是一些教程给我看的方式.那我的特殊错误在哪里?或者,能够同时播放相同剪辑两次的解决方案是什么?

java scala javasound

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

由malloc()`分配的内存有哪些内容?

malloc()用于分配内存空间之后,我很好奇指针究竟是什么?该联机帮助页告诉我calloc()初始化已分配的内存空间为零.

malloc()函数分配大小字节并返回指向已分配内存的指针. 内存未初始化.如果size为0,则malloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.

calloc()函数为每个大小为字节的nmemb元素数组分配内存,并返回指向已分配内存的指针. 内存设置为零.如果nmemb或size为0,则calloc()返回NULL或一个以后可以成功传递给free()的唯一指针值.

我在C中为C(haha)创建了一个非常简短的示例程序:

int main() {
    char *dynamic_chars;
    unsigned amount;
    printf("how much bytes you want to allocate?\n");
    scanf("%d", &amount);

    dynamic_chars = (char*)malloc(amount*sizeof(char));
    printf("allocated:\n%s\n", dynamic_chars);

    free(dynamic_chars);
    return 0;
Run Code Online (Sandbox Code Playgroud)

}

但是,在执行此代码时,它只输出任何内容.如果我初始化内存,例如0xFFFF使用循环初始化每个字节,那么程序会向我显示我期望的内容.内存空间实际存在,因为我不会收到错误声称我正在尝试访问未初始化的变量.

由于内存空间通常不会被删除但被标记为可重写,我想知道如果通过执行我的程序,我是否应该能够看到以前使用的随机内存字节?但我什么都看不到,所以我真的很困惑malloc().

EDIT1

关于malloc()或者可能是内存使用的另一件事,关于我的程序是有趣的:如果我使用calloc(),分配内存,我可以通过例如监视来跟踪我的程序的实际内存使用情况.例如,如果我告诉我的程序,每次分配1.000.000.000字节的内存calloc()我将在我的系统监视器中看到以下内容: 使用<code>malloc()</code>,我什么也看不见.我明白,只是通过分配内存,我当时并没有真正使用它,但我仍然感到困惑的是为什么我的操作系统(unix衍生物)不会将其识别为使用它.因为<code>malloc()</code>就像<code>calloc()</code>将物理地址返回到我没有得到的内存位置一样,这个内存区域似乎实际上并没有被操作系统保留.那么我可以在系统监视器中看到它吗?如果我想将此作为一个新问题发布,请告诉我.但我认为,因为问题仍然是关于<code>malloc()</code>它如何适应这里.</p> </div>
        <p>
          <a href=c malloc initialization dynamic-memory-allocation

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