我已经编写了下面的代码片段:
#include <string>
int main() {
std::string str = "test";
(str == "tes") ? str.replace(0, 1, "T") : 0;
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,它导致logic_error:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
Run Code Online (Sandbox Code Playgroud)
我想知道编译器构造字符串对象的原因吗?
我正在使用 ECC 证书来观察 TLS 的工作原理\xef\xbc\x8c有人可以帮助我区分 和 之间的区别ECDH-ECDSA-AES128-SHA256吗ECDHE-ECDSA-AES128-SHA256?
使用时ECDHE-ECDSA-AES128-SHA256,客户端和服务器端工作正常。
New, TLSv1/SSLv3, Cipher is ECDHE-ECDSA-AES128-SHA256\nServer public key is 256 bit\nSecure Renegotiation IS supported\nCompression: NONE\nExpansion: NONE\nNo ALPN negotiated\nSSL-Session:\n Protocol : TLSv1.2\n Cipher : ECDHE-ECDSA-AES128-SHA256\nRun Code Online (Sandbox Code Playgroud)\n\n使用时出现ECDH-ECDSA-AES128-SHA256故障SERVER_HELLO:
140344027961248:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:769:\nRun Code Online (Sandbox Code Playgroud)\n #include <iostream>
#include <string>
using std::string;
int main(){
string s;
std::cout << "size:" << s.size() << " "
<< "capacity:" << s.capacity() << std::endl;
std::cout << s[3] << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我定义了一个名为s的空字符串对象.两者s.size()和s.capacity()是零,但是,当访问所述元件S [3] ,不存在段错误,为什么呢?
代码如下:
m := make(map[interface{}]interface{})
//read
for i := 0; i< 10000; i++ {
go func() {
for range m {
}
}()
}
//write
for i := 0; i< 10000; i++ {
go func() {
mTemp := make(map[interface{}]interface{})
m = mTemp
}()
}
Run Code Online (Sandbox Code Playgroud)
有10000个读goroutine访问m,另外10000个写goroutine为m分配一个新的map,安全吗?
我在Go 1.12中有一个关于sync.Once()的问题。源代码如下:
// Because no call to Do returns until the one call to f returns, if f causes
// Do to be called, it will deadlock.
func (o *Once) Do(f func()) {
if atomic.LoadUint32(&o.done) == 1 {
return
}
// Slow-path.
o.m.Lock()
defer o.m.Unlock()
if o.done == 0 {
defer atomic.StoreUint32(&o.done, 1)
f()
}
}
Run Code Online (Sandbox Code Playgroud)
为什么不只使用一个uint32变量,然后对该变量执行CAS。它似乎更有效,并且不会导致死锁。
代码如下:
type Once uint32
func (o *Once) Do(f func()) {
if atomic.CompareAndSwapUint32((*uint32)(o), 0, 1) {
f()
}
}
Run Code Online (Sandbox Code Playgroud)